1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "google_apis/drive/drive_api_url_generator.h"
6
7#include "google_apis/drive/test_util.h"
8#include "testing/gtest/include/gtest/gtest.h"
9#include "url/gurl.h"
10
11namespace google_apis {
12
13class DriveApiUrlGeneratorTest : public testing::Test {
14 public:
15  DriveApiUrlGeneratorTest()
16      : url_generator_(
17            GURL(DriveApiUrlGenerator::kBaseUrlForProduction),
18            GURL(DriveApiUrlGenerator::kBaseDownloadUrlForProduction)),
19        test_url_generator_(
20            test_util::GetBaseUrlForTesting(12345),
21            test_util::GetBaseUrlForTesting(12345).Resolve("download/")) {
22  }
23
24 protected:
25  DriveApiUrlGenerator url_generator_;
26  DriveApiUrlGenerator test_url_generator_;
27};
28
29// Make sure the hard-coded urls are returned.
30TEST_F(DriveApiUrlGeneratorTest, GetAboutGetUrl) {
31  EXPECT_EQ("https://www.googleapis.com/drive/v2/about",
32            url_generator_.GetAboutGetUrl().spec());
33  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/about",
34            test_url_generator_.GetAboutGetUrl().spec());
35}
36
37TEST_F(DriveApiUrlGeneratorTest, GetAppsListUrl) {
38  const bool use_internal_url = true;
39  EXPECT_EQ("https://www.googleapis.com/drive/v2internal/apps",
40            url_generator_.GetAppsListUrl(use_internal_url).spec());
41  EXPECT_EQ("https://www.googleapis.com/drive/v2/apps",
42            url_generator_.GetAppsListUrl(!use_internal_url).spec());
43  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/apps",
44            test_url_generator_.GetAppsListUrl(!use_internal_url).spec());
45}
46
47TEST_F(DriveApiUrlGeneratorTest, GetAppsDeleteUrl) {
48  EXPECT_EQ("https://www.googleapis.com/drive/v2internal/apps/0ADK06pfg",
49            url_generator_.GetAppsDeleteUrl("0ADK06pfg").spec());
50  EXPECT_EQ("http://127.0.0.1:12345/drive/v2internal/apps/0ADK06pfg",
51            test_url_generator_.GetAppsDeleteUrl("0ADK06pfg").spec());
52}
53
54TEST_F(DriveApiUrlGeneratorTest, GetFilesGetUrl) {
55  // |file_id| should be embedded into the url.
56  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/0ADK06pfg",
57            url_generator_.GetFilesGetUrl("0ADK06pfg").spec());
58  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/0Bz0bd074",
59            url_generator_.GetFilesGetUrl("0Bz0bd074").spec());
60  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/file%3Afile_id",
61            url_generator_.GetFilesGetUrl("file:file_id").spec());
62
63  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/0ADK06pfg",
64            test_url_generator_.GetFilesGetUrl("0ADK06pfg").spec());
65  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/0Bz0bd074",
66            test_url_generator_.GetFilesGetUrl("0Bz0bd074").spec());
67  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/file%3Afile_id",
68            test_url_generator_.GetFilesGetUrl("file:file_id").spec());
69}
70
71TEST_F(DriveApiUrlGeneratorTest, GetFilesAuthorizeUrl) {
72  EXPECT_EQ(
73      "https://www.googleapis.com/drive/v2internal/files/aa/authorize?appId=bb",
74            url_generator_.GetFilesAuthorizeUrl("aa", "bb").spec());
75  EXPECT_EQ(
76      "http://127.0.0.1:12345/drive/v2internal/files/foo/authorize?appId=bar",
77      test_url_generator_.GetFilesAuthorizeUrl("foo", "bar").spec());
78}
79
80TEST_F(DriveApiUrlGeneratorTest, GetFilesInsertUrl) {
81  EXPECT_EQ("https://www.googleapis.com/drive/v2/files",
82            url_generator_.GetFilesInsertUrl().spec());
83  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files",
84            test_url_generator_.GetFilesInsertUrl().spec());
85}
86
87TEST_F(DriveApiUrlGeneratorTest, GetFilePatchUrl) {
88  struct TestPattern {
89    bool set_modified_date;
90    bool update_viewed_date;
91    const std::string expected_query;
92  };
93  const TestPattern kTestPatterns[] = {
94    { false, true, "" },
95    { true, true, "?setModifiedDate=true" },
96    { false, false, "?updateViewedDate=false" },
97    { true, false, "?setModifiedDate=true&updateViewedDate=false" },
98  };
99
100  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestPatterns); ++i) {
101    EXPECT_EQ(
102        "https://www.googleapis.com/drive/v2/files/0ADK06pfg" +
103            kTestPatterns[i].expected_query,
104        url_generator_.GetFilesPatchUrl(
105            "0ADK06pfg",
106            kTestPatterns[i].set_modified_date,
107            kTestPatterns[i].update_viewed_date).spec());
108
109    EXPECT_EQ(
110        "https://www.googleapis.com/drive/v2/files/0Bz0bd074" +
111            kTestPatterns[i].expected_query,
112        url_generator_.GetFilesPatchUrl(
113            "0Bz0bd074",
114            kTestPatterns[i].set_modified_date,
115            kTestPatterns[i].update_viewed_date).spec());
116
117    EXPECT_EQ(
118        "https://www.googleapis.com/drive/v2/files/file%3Afile_id" +
119            kTestPatterns[i].expected_query,
120        url_generator_.GetFilesPatchUrl(
121            "file:file_id",
122            kTestPatterns[i].set_modified_date,
123            kTestPatterns[i].update_viewed_date).spec());
124
125
126    EXPECT_EQ(
127        "http://127.0.0.1:12345/drive/v2/files/0ADK06pfg" +
128            kTestPatterns[i].expected_query,
129        test_url_generator_.GetFilesPatchUrl(
130            "0ADK06pfg",
131            kTestPatterns[i].set_modified_date,
132            kTestPatterns[i].update_viewed_date).spec());
133
134    EXPECT_EQ(
135        "http://127.0.0.1:12345/drive/v2/files/0Bz0bd074" +
136            kTestPatterns[i].expected_query,
137        test_url_generator_.GetFilesPatchUrl(
138            "0Bz0bd074",
139            kTestPatterns[i].set_modified_date,
140            kTestPatterns[i].update_viewed_date).spec());
141
142    EXPECT_EQ(
143        "http://127.0.0.1:12345/drive/v2/files/file%3Afile_id" +
144            kTestPatterns[i].expected_query,
145        test_url_generator_.GetFilesPatchUrl(
146            "file:file_id",
147            kTestPatterns[i].set_modified_date,
148            kTestPatterns[i].update_viewed_date).spec());
149  }
150}
151
152TEST_F(DriveApiUrlGeneratorTest, GetFilesCopyUrl) {
153  // |file_id| should be embedded into the url.
154  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/0ADK06pfg/copy",
155            url_generator_.GetFilesCopyUrl("0ADK06pfg").spec());
156  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/0Bz0bd074/copy",
157            url_generator_.GetFilesCopyUrl("0Bz0bd074").spec());
158  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/file%3Afile_id/copy",
159            url_generator_.GetFilesCopyUrl("file:file_id").spec());
160
161  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/0ADK06pfg/copy",
162            test_url_generator_.GetFilesCopyUrl("0ADK06pfg").spec());
163  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/0Bz0bd074/copy",
164            test_url_generator_.GetFilesCopyUrl("0Bz0bd074").spec());
165  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/file%3Afile_id/copy",
166            test_url_generator_.GetFilesCopyUrl("file:file_id").spec());
167}
168
169TEST_F(DriveApiUrlGeneratorTest, GetFilesListUrl) {
170  struct TestPattern {
171    int max_results;
172    const std::string page_token;
173    const std::string q;
174    const std::string expected_query;
175  };
176  const TestPattern kTestPatterns[] = {
177    { 100, "", "", "" },
178    { 150, "", "", "?maxResults=150" },
179    { 10, "", "", "?maxResults=10" },
180    { 100, "token", "", "?pageToken=token" },
181    { 150, "token", "", "?maxResults=150&pageToken=token" },
182    { 10, "token", "", "?maxResults=10&pageToken=token" },
183    { 100, "", "query", "?q=query" },
184    { 150, "", "query", "?maxResults=150&q=query" },
185    { 10, "", "query", "?maxResults=10&q=query" },
186    { 100, "token", "query", "?pageToken=token&q=query" },
187    { 150, "token", "query", "?maxResults=150&pageToken=token&q=query" },
188    { 10, "token", "query", "?maxResults=10&pageToken=token&q=query" },
189  };
190
191  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestPatterns); ++i) {
192    EXPECT_EQ(
193        "https://www.googleapis.com/drive/v2/files" +
194            kTestPatterns[i].expected_query,
195        url_generator_.GetFilesListUrl(
196            kTestPatterns[i].max_results, kTestPatterns[i].page_token,
197            kTestPatterns[i].q).spec());
198
199    EXPECT_EQ(
200        "http://127.0.0.1:12345/drive/v2/files" +
201            kTestPatterns[i].expected_query,
202        test_url_generator_.GetFilesListUrl(
203            kTestPatterns[i].max_results, kTestPatterns[i].page_token,
204            kTestPatterns[i].q).spec());
205  }
206}
207
208TEST_F(DriveApiUrlGeneratorTest, GetFilesDeleteUrl) {
209  // |file_id| should be embedded into the url.
210  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/0ADK06pfg",
211            url_generator_.GetFilesDeleteUrl("0ADK06pfg").spec());
212  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/0Bz0bd074",
213            url_generator_.GetFilesDeleteUrl("0Bz0bd074").spec());
214  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/file%3Afile_id",
215            url_generator_.GetFilesDeleteUrl("file:file_id").spec());
216
217  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/0ADK06pfg",
218            test_url_generator_.GetFilesDeleteUrl("0ADK06pfg").spec());
219  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/0Bz0bd074",
220            test_url_generator_.GetFilesDeleteUrl("0Bz0bd074").spec());
221  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/file%3Afile_id",
222            test_url_generator_.GetFilesDeleteUrl("file:file_id").spec());
223}
224
225TEST_F(DriveApiUrlGeneratorTest, GetFilesTrashUrl) {
226  // |file_id| should be embedded into the url.
227  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/0ADK06pfg/trash",
228            url_generator_.GetFilesTrashUrl("0ADK06pfg").spec());
229  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/0Bz0bd074/trash",
230            url_generator_.GetFilesTrashUrl("0Bz0bd074").spec());
231  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/file%3Afile_id/trash",
232            url_generator_.GetFilesTrashUrl("file:file_id").spec());
233
234  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/0ADK06pfg/trash",
235            test_url_generator_.GetFilesTrashUrl("0ADK06pfg").spec());
236  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/0Bz0bd074/trash",
237            test_url_generator_.GetFilesTrashUrl("0Bz0bd074").spec());
238  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/file%3Afile_id/trash",
239            test_url_generator_.GetFilesTrashUrl("file:file_id").spec());
240}
241
242TEST_F(DriveApiUrlGeneratorTest, GetChangesListUrl) {
243  struct TestPattern {
244    bool include_deleted;
245    int max_results;
246    const std::string page_token;
247    int64 start_change_id;
248    const std::string expected_query;
249  };
250  const TestPattern kTestPatterns[] = {
251    { true, 100, "", 0, "" },
252    { false, 100, "", 0, "?includeDeleted=false" },
253    { true, 150, "", 0, "?maxResults=150" },
254    { false, 150, "", 0, "?includeDeleted=false&maxResults=150" },
255    { true, 10, "", 0, "?maxResults=10" },
256    { false, 10, "", 0, "?includeDeleted=false&maxResults=10" },
257
258    { true, 100, "token", 0, "?pageToken=token" },
259    { false, 100, "token", 0, "?includeDeleted=false&pageToken=token" },
260    { true, 150, "token", 0, "?maxResults=150&pageToken=token" },
261    { false, 150, "token", 0,
262      "?includeDeleted=false&maxResults=150&pageToken=token" },
263    { true, 10, "token", 0, "?maxResults=10&pageToken=token" },
264    { false, 10, "token", 0,
265      "?includeDeleted=false&maxResults=10&pageToken=token" },
266
267    { true, 100, "", 12345, "?startChangeId=12345" },
268    { false, 100, "", 12345, "?includeDeleted=false&startChangeId=12345" },
269    { true, 150, "", 12345, "?maxResults=150&startChangeId=12345" },
270    { false, 150, "", 12345,
271      "?includeDeleted=false&maxResults=150&startChangeId=12345" },
272    { true, 10, "", 12345, "?maxResults=10&startChangeId=12345" },
273    { false, 10, "", 12345,
274      "?includeDeleted=false&maxResults=10&startChangeId=12345" },
275
276    { true, 100, "token", 12345, "?pageToken=token&startChangeId=12345" },
277    { false, 100, "token", 12345,
278      "?includeDeleted=false&pageToken=token&startChangeId=12345" },
279    { true, 150, "token", 12345,
280      "?maxResults=150&pageToken=token&startChangeId=12345" },
281    { false, 150, "token", 12345,
282      "?includeDeleted=false&maxResults=150&pageToken=token"
283      "&startChangeId=12345" },
284    { true, 10, "token", 12345,
285      "?maxResults=10&pageToken=token&startChangeId=12345" },
286    { false, 10, "token", 12345,
287      "?includeDeleted=false&maxResults=10&pageToken=token"
288      "&startChangeId=12345" },
289  };
290
291  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestPatterns); ++i) {
292    EXPECT_EQ(
293        "https://www.googleapis.com/drive/v2/changes" +
294            kTestPatterns[i].expected_query,
295        url_generator_.GetChangesListUrl(
296            kTestPatterns[i].include_deleted,
297            kTestPatterns[i].max_results,
298            kTestPatterns[i].page_token,
299            kTestPatterns[i].start_change_id).spec());
300
301    EXPECT_EQ(
302        "http://127.0.0.1:12345/drive/v2/changes" +
303            kTestPatterns[i].expected_query,
304        test_url_generator_.GetChangesListUrl(
305            kTestPatterns[i].include_deleted,
306            kTestPatterns[i].max_results,
307            kTestPatterns[i].page_token,
308            kTestPatterns[i].start_change_id).spec());
309  }
310}
311
312TEST_F(DriveApiUrlGeneratorTest, GetChildrenInsertUrl) {
313  // |file_id| should be embedded into the url.
314  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/0ADK06pfg/children",
315            url_generator_.GetChildrenInsertUrl("0ADK06pfg").spec());
316  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/0Bz0bd074/children",
317            url_generator_.GetChildrenInsertUrl("0Bz0bd074").spec());
318  EXPECT_EQ(
319      "https://www.googleapis.com/drive/v2/files/file%3Afolder_id/children",
320      url_generator_.GetChildrenInsertUrl("file:folder_id").spec());
321
322  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/0ADK06pfg/children",
323            test_url_generator_.GetChildrenInsertUrl("0ADK06pfg").spec());
324  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/0Bz0bd074/children",
325            test_url_generator_.GetChildrenInsertUrl("0Bz0bd074").spec());
326  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/file%3Afolder_id/children",
327            test_url_generator_.GetChildrenInsertUrl("file:folder_id").spec());
328}
329
330TEST_F(DriveApiUrlGeneratorTest, GetChildrenDeleteUrl) {
331  // |file_id| should be embedded into the url.
332  EXPECT_EQ(
333      "https://www.googleapis.com/drive/v2/files/0ADK06pfg/children/0Bz0bd074",
334      url_generator_.GetChildrenDeleteUrl("0Bz0bd074", "0ADK06pfg").spec());
335  EXPECT_EQ(
336      "https://www.googleapis.com/drive/v2/files/0Bz0bd074/children/0ADK06pfg",
337      url_generator_.GetChildrenDeleteUrl("0ADK06pfg", "0Bz0bd074").spec());
338  EXPECT_EQ(
339      "https://www.googleapis.com/drive/v2/files/file%3Afolder_id/children"
340      "/file%3Achild_id",
341      url_generator_.GetChildrenDeleteUrl(
342          "file:child_id", "file:folder_id").spec());
343
344  EXPECT_EQ(
345      "http://127.0.0.1:12345/drive/v2/files/0ADK06pfg/children/0Bz0bd074",
346      test_url_generator_.GetChildrenDeleteUrl(
347          "0Bz0bd074", "0ADK06pfg").spec());
348  EXPECT_EQ(
349      "http://127.0.0.1:12345/drive/v2/files/0Bz0bd074/children/0ADK06pfg",
350      test_url_generator_.GetChildrenDeleteUrl(
351          "0ADK06pfg", "0Bz0bd074").spec());
352  EXPECT_EQ(
353      "http://127.0.0.1:12345/drive/v2/files/file%3Afolder_id/children/"
354      "file%3Achild_id",
355      test_url_generator_.GetChildrenDeleteUrl(
356          "file:child_id", "file:folder_id").spec());
357}
358
359TEST_F(DriveApiUrlGeneratorTest, GetInitiateUploadNewFileUrl) {
360  const bool kSetModifiedDate = true;
361
362  EXPECT_EQ(
363      "https://www.googleapis.com/upload/drive/v2/files?uploadType=resumable",
364      url_generator_.GetInitiateUploadNewFileUrl(!kSetModifiedDate).spec());
365
366  EXPECT_EQ(
367      "http://127.0.0.1:12345/upload/drive/v2/files?uploadType=resumable",
368      test_url_generator_.GetInitiateUploadNewFileUrl(
369          !kSetModifiedDate).spec());
370
371  EXPECT_EQ(
372      "http://127.0.0.1:12345/upload/drive/v2/files?uploadType=resumable&"
373      "setModifiedDate=true",
374      test_url_generator_.GetInitiateUploadNewFileUrl(
375          kSetModifiedDate).spec());
376}
377
378TEST_F(DriveApiUrlGeneratorTest, GetInitiateUploadExistingFileUrl) {
379  const bool kSetModifiedDate = true;
380
381  // |resource_id| should be embedded into the url.
382  EXPECT_EQ(
383      "https://www.googleapis.com/upload/drive/v2/files/0ADK06pfg"
384      "?uploadType=resumable",
385      url_generator_.GetInitiateUploadExistingFileUrl(
386          "0ADK06pfg", !kSetModifiedDate).spec());
387  EXPECT_EQ(
388      "https://www.googleapis.com/upload/drive/v2/files/0Bz0bd074"
389      "?uploadType=resumable",
390      url_generator_.GetInitiateUploadExistingFileUrl(
391          "0Bz0bd074", !kSetModifiedDate).spec());
392  EXPECT_EQ(
393      "https://www.googleapis.com/upload/drive/v2/files/file%3Afile_id"
394      "?uploadType=resumable",
395      url_generator_.GetInitiateUploadExistingFileUrl(
396          "file:file_id", !kSetModifiedDate).spec());
397  EXPECT_EQ(
398      "https://www.googleapis.com/upload/drive/v2/files/file%3Afile_id"
399      "?uploadType=resumable&setModifiedDate=true",
400      url_generator_.GetInitiateUploadExistingFileUrl(
401          "file:file_id", kSetModifiedDate).spec());
402
403  EXPECT_EQ(
404      "http://127.0.0.1:12345/upload/drive/v2/files/0ADK06pfg"
405      "?uploadType=resumable",
406      test_url_generator_.GetInitiateUploadExistingFileUrl(
407          "0ADK06pfg", !kSetModifiedDate).spec());
408  EXPECT_EQ(
409      "http://127.0.0.1:12345/upload/drive/v2/files/0Bz0bd074"
410      "?uploadType=resumable",
411      test_url_generator_.GetInitiateUploadExistingFileUrl(
412          "0Bz0bd074", !kSetModifiedDate).spec());
413  EXPECT_EQ(
414      "http://127.0.0.1:12345/upload/drive/v2/files/file%3Afile_id"
415      "?uploadType=resumable",
416      test_url_generator_.GetInitiateUploadExistingFileUrl(
417          "file:file_id", !kSetModifiedDate).spec());
418  EXPECT_EQ(
419      "http://127.0.0.1:12345/upload/drive/v2/files/file%3Afile_id"
420      "?uploadType=resumable&setModifiedDate=true",
421      test_url_generator_.GetInitiateUploadExistingFileUrl(
422          "file:file_id", kSetModifiedDate).spec());
423}
424
425TEST_F(DriveApiUrlGeneratorTest, GenerateDownloadFileUrl) {
426  EXPECT_EQ(
427      "https://www.googledrive.com/host/resourceId",
428      url_generator_.GenerateDownloadFileUrl("resourceId").spec());
429  EXPECT_EQ(
430      "https://www.googledrive.com/host/file%3AresourceId",
431      url_generator_.GenerateDownloadFileUrl("file:resourceId").spec());
432  EXPECT_EQ(
433      "http://127.0.0.1:12345/download/resourceId",
434      test_url_generator_.GenerateDownloadFileUrl("resourceId").spec());
435}
436
437TEST_F(DriveApiUrlGeneratorTest, GeneratePermissionsInsertUrl) {
438  EXPECT_EQ("https://www.googleapis.com/drive/v2/files/0ADK06pfg/permissions",
439            url_generator_.GetPermissionsInsertUrl("0ADK06pfg").spec());
440  EXPECT_EQ("http://127.0.0.1:12345/drive/v2/files/file%3Aabc/permissions",
441            test_url_generator_.GetPermissionsInsertUrl("file:abc").spec());
442}
443
444}  // namespace google_apis
445