forked from TrueCloudLab/distribution
106 lines
3 KiB
Go
106 lines
3 KiB
Go
|
// 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")
|
||
|
}
|
||
|
}
|