| // Copyright 2017 Google LLC. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package main |
| |
| import ( |
| "bytes" |
| "flag" |
| "fmt" |
| "io/ioutil" |
| "path/filepath" |
| "strings" |
| "testing" |
| |
| "google.golang.org/api/internal/version" |
| ) |
| |
| var updateGolden = flag.Bool("update_golden", false, "If true, causes TestAPIs to update golden files") |
| |
| func TestAPIs(t *testing.T) { |
| *copyrightYear = "YEAR" |
| |
| names := []string{ |
| "any", |
| "arrayofarray-1", |
| "arrayofenum", |
| "arrayofmapofobjects", |
| "arrayofmapofstrings", |
| "blogger-3", |
| "floats", |
| "getwithoutbody", |
| "http-body", |
| "json-body", |
| "mapofany", |
| "mapofarrayofobjects", |
| "mapofint64strings", |
| "mapofobjects", |
| "mapofstrings-1", |
| "param-rename", |
| "quotednum", |
| "repeated", |
| "required-query", |
| "resource-named-service", // appengine/v1/appengine-api.json |
| "unfortunatedefaults", |
| "variants", |
| "wrapnewlines", |
| } |
| for _, name := range names { |
| t.Run(name, func(t *testing.T) { |
| api, err := apiFromFile(filepath.Join("testdata", name+".json")) |
| if err != nil { |
| t.Fatalf("Error loading API testdata/%s.json: %v", name, err) |
| } |
| clean, err := api.GenerateCode() |
| if err != nil { |
| t.Fatalf("Error generating code for %s: %v", name, err) |
| } |
| goldenFile := filepath.Join("testdata", name+".want") |
| if *updateGolden { |
| if err := ioutil.WriteFile(goldenFile, clean, 0644); err != nil { |
| t.Fatal(err) |
| } |
| } |
| want, err := ioutil.ReadFile(goldenFile) |
| if err != nil { |
| t.Fatal(err) |
| } |
| wantStr := strings.Replace(string(want), "gl-go/1.12.5", fmt.Sprintf("gl-go/%s", version.Go()), -1) |
| wantStr = strings.Replace(wantStr, "gdcl/00000000", fmt.Sprintf("gdcl/%s", version.Repo), -1) |
| want = []byte(wantStr) |
| if !bytes.Equal(want, clean) { |
| tf, _ := ioutil.TempFile("", "api-"+name+"-got-json.") |
| if _, err := tf.Write(clean); err != nil { |
| t.Fatal(err) |
| } |
| if err := tf.Close(); err != nil { |
| t.Fatal(err) |
| } |
| t.Errorf("Output for API %s differs: diff -u %s %s", name, goldenFile, tf.Name()) |
| } |
| }) |
| } |
| } |
| |
| func TestScope(t *testing.T) { |
| tests := [][]string{ |
| { |
| "https://www.googleapis.com/auth/somescope", |
| "SomescopeScope", |
| }, |
| { |
| "https://mail.google.com/somescope", |
| "MailGoogleComSomescopeScope", |
| }, |
| { |
| "https://mail.google.com/", |
| "MailGoogleComScope", |
| }, |
| } |
| for _, test := range tests { |
| if got := scopeIdentifierFromURL(test[0]); got != test[1] { |
| t.Errorf("scopeIdentifierFromURL(%q) got %q, want %q", test[0], got, test[1]) |
| } |
| } |
| } |
| |
| func TestDepunct(t *testing.T) { |
| tests := []struct { |
| needCap bool |
| in, want string |
| }{ |
| { |
| needCap: true, |
| in: "part__description", |
| want: "Part__description", |
| }, |
| { |
| needCap: true, |
| in: "Part_description", |
| want: "PartDescription", |
| }, |
| { |
| needCap: false, |
| in: "part_description", |
| want: "partDescription", |
| }, |
| { |
| needCap: false, |
| in: "part-description", |
| want: "partDescription", |
| }, |
| { |
| needCap: false, |
| in: "part.description", |
| want: "partDescription", |
| }, |
| { |
| needCap: false, |
| in: "part$description", |
| want: "partDescription", |
| }, |
| { |
| needCap: false, |
| in: "part/description", |
| want: "partDescription", |
| }, |
| { |
| needCap: true, |
| in: "Part__description_name", |
| want: "Part__descriptionName", |
| }, |
| { |
| needCap: true, |
| in: "Part_description_name", |
| want: "PartDescriptionName", |
| }, |
| { |
| needCap: true, |
| in: "Part__description__name", |
| want: "Part__description__name", |
| }, |
| { |
| needCap: true, |
| in: "Part_description__name", |
| want: "PartDescription__name", |
| }, |
| } |
| for _, test := range tests { |
| if got := depunct(test.in, test.needCap); got != test.want { |
| t.Errorf("depunct(%q,%v) = %q; want %q", test.in, test.needCap, got, test.want) |
| } |
| } |
| } |
| |
| func TestRenameVersion(t *testing.T) { |
| tests := []struct { |
| version, want string |
| }{ |
| { |
| version: "directory_v1", |
| want: "directory/v1", |
| }, |
| { |
| version: "email_migration_v1", |
| want: "email_migration/v1", |
| }, |
| { |
| version: "my_api_v1.2", |
| want: "my_api/v1.2", |
| }, |
| } |
| for _, test := range tests { |
| if got := renameVersion(test.version); got != test.want { |
| t.Errorf("renameVersion(%q) = %q; want %q", test.version, got, test.want) |
| } |
| } |
| } |
| |
| func TestSupportsPaging(t *testing.T) { |
| api, err := apiFromFile(filepath.Join("testdata", "paging.json")) |
| if err != nil { |
| t.Fatalf("Error loading API testdata/paging.json: %v", err) |
| } |
| api.PopulateSchemas() |
| res := api.doc.Resources[0] |
| for _, meth := range api.resourceMethods(res) { |
| _, _, got := meth.supportsPaging() |
| want := strings.HasPrefix(meth.m.Name, "yes") |
| if got != want { |
| t.Errorf("method %s supports paging: got %t, want %t", meth.m.Name, got, want) |
| } |
| } |
| } |