// 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" "reflect" "testing" "golang.org/x/net/context" ) // readServiceStub services read requests by returning data from an in-memory list of values. type listTablesServiceStub struct { expectedProject, expectedDataset string values [][]*Table // contains pages of tables. pageTokens map[string]string // maps incoming page token to returned page token. service } func (s *listTablesServiceStub) listTables(ctx context.Context, projectID, datasetID, 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") } tables := s.values[0] s.values = s.values[1:] return tables, s.pageTokens[pageToken], nil } func TestListTables(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"} testCases := []struct { data [][]*Table pageTokens map[string]string want []*Table }{ { data: [][]*Table{{t1, t2}, {t3}}, pageTokens: map[string]string{"": "a", "a": ""}, want: []*Table{t1, t2, t3}, }, { data: [][]*Table{{t1, t2}, {t3}}, pageTokens: map[string]string{"": ""}, // no more pages after first one. want: []*Table{t1, t2}, }, } for _, tc := range testCases { c := &Client{ service: &listTablesServiceStub{ expectedProject: "x", expectedDataset: "y", values: tc.data, pageTokens: tc.pageTokens, }, projectID: "x", } got, err := c.Dataset("y").ListTables(context.Background()) if err != nil { t.Errorf("err calling ListTables: %v", err) continue } if !reflect.DeepEqual(got, tc.want) { t.Errorf("reading: got:\n%v\nwant:\n%v", got, tc.want) } } } func TestListTablesError(t *testing.T) { c := &Client{ service: &listTablesServiceStub{ expectedProject: "x", expectedDataset: "y", }, projectID: "x", } // Test that service read errors are propagated back to the caller. // Passing "not y" as the dataset id will cause the service to return an error. _, err := c.Dataset("not y").ListTables(context.Background()) if err == nil { // Read should not return an error; only Err should. t.Errorf("ListTables expected: non-nil err, got: nil") } }