// Copyright 2015 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package bigquery import ( "errors" "strconv" "testing" "golang.org/x/net/context" itest "google.golang.org/api/iterator/testing" ) // readServiceStub services read requests by returning data from an in-memory list of values. type listTablesServiceStub struct { expectedProject, expectedDataset string tables []*Table service } func (s *listTablesServiceStub) listTables(ctx context.Context, projectID, datasetID string, pageSize int, pageToken string) ([]*Table, string, error) { if projectID != s.expectedProject { return nil, "", errors.New("wrong project id") } if datasetID != s.expectedDataset { return nil, "", errors.New("wrong dataset id") } const maxPageSize = 2 if pageSize <= 0 || pageSize > maxPageSize { pageSize = maxPageSize } start := 0 if pageToken != "" { var err error start, err = strconv.Atoi(pageToken) if err != nil { return nil, "", err } } end := start + pageSize if end > len(s.tables) { end = len(s.tables) } nextPageToken := "" if end < len(s.tables) { nextPageToken = strconv.Itoa(end) } return s.tables[start:end], nextPageToken, nil } func TestTables(t *testing.T) { t1 := &Table{ProjectID: "p1", DatasetID: "d1", TableID: "t1"} t2 := &Table{ProjectID: "p1", DatasetID: "d1", TableID: "t2"} t3 := &Table{ProjectID: "p1", DatasetID: "d1", TableID: "t3"} allTables := []*Table{t1, t2, t3} c := &Client{ service: &listTablesServiceStub{ expectedProject: "x", expectedDataset: "y", tables: allTables, }, projectID: "x", } msg, ok := itest.TestIterator(allTables, func() interface{} { return c.Dataset("y").Tables(context.Background()) }, func(it interface{}) (interface{}, error) { return it.(*TableIterator).Next() }) if !ok { t.Error(msg) } } type listDatasetsFake struct { service projectID string datasets []*Dataset hidden map[*Dataset]bool } func (df *listDatasetsFake) listDatasets(_ context.Context, projectID string, pageSize int, pageToken string, listHidden bool, filter string) ([]*Dataset, string, error) { const maxPageSize = 2 if pageSize <= 0 || pageSize > maxPageSize { pageSize = maxPageSize } if filter != "" { return nil, "", errors.New("filter not supported") } if projectID != df.projectID { return nil, "", errors.New("bad project ID") } start := 0 if pageToken != "" { var err error start, err = strconv.Atoi(pageToken) if err != nil { return nil, "", err } } var ( i int result []*Dataset nextPageToken string ) for i = start; len(result) < pageSize && i < len(df.datasets); i++ { if df.hidden[df.datasets[i]] && !listHidden { continue } result = append(result, df.datasets[i]) } if i < len(df.datasets) { nextPageToken = strconv.Itoa(i) } return result, nextPageToken, nil } func TestDatasets(t *testing.T) { service := &listDatasetsFake{projectID: "p"} client := &Client{service: service} datasets := []*Dataset{ {"p", "a", client}, {"p", "b", client}, {"p", "hidden", client}, {"p", "c", client}, } service.datasets = datasets service.hidden = map[*Dataset]bool{datasets[2]: true} c := &Client{ projectID: "p", service: service, } msg, ok := itest.TestIterator(datasets, func() interface{} { it := c.Datasets(context.Background()); it.ListHidden = true; return it }, func(it interface{}) (interface{}, error) { return it.(*DatasetIterator).Next() }) if !ok { t.Fatalf("ListHidden=true: %s", msg) } msg, ok = itest.TestIterator([]*Dataset{datasets[0], datasets[1], datasets[3]}, func() interface{} { it := c.Datasets(context.Background()); it.ListHidden = false; return it }, func(it interface{}) (interface{}, error) { return it.(*DatasetIterator).Next() }) if !ok { t.Fatalf("ListHidden=false: %s", msg) } }