bigquery/api/Snippets/Test.cs (302 lines of code) (raw):

// Copyright(c) 2018 Google LLC // // 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. // using Google.Apis.Bigquery.v2.Data; using Google.Cloud.BigQuery.V2; using Google.Cloud.Storage.V1; using GoogleCloudSamples; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; using Xunit; public class BigQueryTest : IDisposable, IClassFixture<RandomBucketFixture> { private readonly string _projectId; private readonly string _jsonPath; private readonly BigQueryClient _client; readonly List<BigQueryDataset> _tempDatasets = new List<BigQueryDataset>(); readonly StorageClient _storage; readonly string _bucketName; readonly TextWriter _consoleOut = Console.Out; readonly StringWriter _stringOut; public BigQueryTest(RandomBucketFixture randomBucketFixture) { _projectId = Environment.GetEnvironmentVariable("GOOGLE_PROJECT_ID"); _jsonPath = System.Environment.GetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS"); _client = BigQueryClient.Create(_projectId); _storage = StorageClient.Create(); _bucketName = randomBucketFixture.BucketName; _stringOut = new StringWriter(); Console.SetOut(_stringOut); } [Fact] public void TestAuthenticateServiceAccount() { var snippet = new BigQueryAuthenticateServiceAccount(); snippet.AuthenticateWithServiceAccount(_projectId, _jsonPath); var outputLines = _stringOut.ToString().Trim().Split(Environment.NewLine); Assert.Equal(100, outputLines.Count()); } [Fact] public void TestBrowseTable() { var snippet = new BigQueryBrowseTable(); snippet.BrowseTable(_projectId); var outputLines = _stringOut.ToString().Trim().Split(Environment.NewLine); Assert.Equal(10, outputLines.Count()); } [Fact] public void TestCopyTable() { var snippet = new BigQueryCopyTable(); string destinationDatasetId = CreateTempDataset(); snippet.CopyTable(_projectId, destinationDatasetId); var output = _stringOut.ToString(); var numRows = Int64.Parse(Regex.Match(output, @"\d+").Value); Assert.True(numRows > 0); } [Fact] public void TestCreateDataset() { var snippet = new BigQueryCreateDataset(); BigQueryDataset dataset = snippet.CreateDataset(_projectId); Assert.Equal("US", dataset.Resource.Location); dataset.Delete(); } [Fact] public void TestCreateJob() { var snippet = new BigQueryCreateJob(); BigQueryJob job = snippet.CreateJob(_projectId); Assert.NotNull(job); } [Fact] public void TestCreateTable() { var snippet = new BigQueryCreateTable(); string datasetId = CreateTempDataset(); BigQueryTable table = snippet.CreateTable(_projectId, datasetId); Assert.Equal("your_table_id", table.Resource.TableReference.TableId); } [Fact] public void TestCreateTableRangePartitioned() { var snippet = new BigQueryCreateTableRangePartitioned(); string datasetId = CreateTempDataset(); BigQueryTable table = snippet.CreateTable(_projectId, datasetId, "partitioned-table"); Assert.NotNull(table.Resource.RangePartitioning); } [Fact] public void TestDeleteDataset() { var snippet = new BigQueryDeleteDataset(); string datasetId = TestUtil.RandomName(); _client.CreateDataset(datasetId); snippet.DeleteDataset(_projectId, datasetId); var output = _stringOut.ToString(); Assert.Contains($"{datasetId} deleted", output); } [Fact] public void TestDeleteDatasetAndContents() { var snippet = new BigQueryDeleteDatasetAndContents(); string datasetId = TestUtil.RandomName(); _client.CreateDataset(datasetId); CreateTempEmptyTable(datasetId); snippet.DeleteDatasetAndContents(_projectId, datasetId); var output = _stringOut.ToString(); Assert.Contains($"{datasetId} and contents deleted", output); } [Fact] public void TestDeleteTable() { var snippet = new BigQueryDeleteTable(); string datasetId = CreateTempDataset(); string tableId = TestUtil.RandomName(); _client.CreateTable(datasetId, tableId, new Table()); snippet.DeleteTable(_projectId, datasetId, tableId); var output = _stringOut.ToString(); Assert.Contains($"{tableId} deleted", output); } [Fact] public void TestExtractModel() { string datasetId = CreateTempDataset(); string modelId = TestUtil.RandomName(); string createModelSql = $@" CREATE MODEL {datasetId}.{modelId} OPTIONS (model_type='linear_reg', input_label_cols=['label'], max_iterations = 1, learn_rate=0.4, learn_rate_strategy='constant') AS SELECT 'a' AS f1, 2.0 AS label UNION ALL SELECT 'b' AS f1, 3.8 AS label"; var createModelJob = _client.CreateQueryJob(createModelSql, null); createModelJob.PollUntilCompleted().ThrowOnAnyError(); Assert.NotNull(_client.GetModel(datasetId, modelId)); var snippet = new BigQueryExtractModel(); snippet.ExtractModel(_projectId, datasetId, modelId, $"gs://{_bucketName}/model"); var modelFiles = _storage.ListObjects(_bucketName, "model/").ToList(); // We end up with multiple files for the model. Assert.True(modelFiles.Count > 4); } [Fact] public void TestExtractTable() { var snippet = new BigQueryExtractTable(); snippet.ExtractTable(_projectId, _bucketName); var uploadedFile = _storage.ListObjects(_bucketName, "shakespeare").First(); Assert.True(uploadedFile.Size > 0); } [Fact] public void TestExtractTableJson() { var snippet = new BigQueryExtractTableJson(); snippet.ExtractTableJson(_projectId, _bucketName); var uploadedFile = _storage.GetObject(_bucketName, "shakespeare.json"); Assert.True(uploadedFile.Size > 0); } [Fact] public void TestListDatasets() { var snippet = new BigQueryListDatasets(); var datasetId1 = CreateTempDataset(); var datasetId2 = CreateTempDataset(); snippet.ListDatasets(_projectId); var output = _stringOut.ToString(); Assert.Contains($"{datasetId1}", output); Assert.Contains($"{datasetId2}", output); } [Fact] public void TestListTables() { var snippet = new BigQueryListTables(); var datasetId = CreateTempDataset(); var tableId1 = CreateTempEmptyTable(datasetId); var tableId2 = CreateTempEmptyTable(datasetId); snippet.ListTables(_projectId, datasetId); var output = _stringOut.ToString(); Assert.Contains($"{tableId1}", output); Assert.Contains($"{tableId2}", output); } [Fact] public void TestLoadFromFile() { var snippet = new BigQueryLoadFromFile(); var datasetId = CreateTempDataset(); var tableId = CreateTempEmptyTable(datasetId); string filePath = Path.Combine("data", "sample.csv"); snippet.LoadFromFile(_projectId, datasetId, tableId, filePath); var output = _stringOut.ToString(); long numRows = Convert.ToInt64(Regex.Match(output, @"\d+").Value); Assert.Equal(4, numRows); } [Fact] public void TestLoadTableGcsCsv() { var snippet = new BigQueryLoadTableGcsCsv(); var datasetId = CreateTempDataset(); snippet.LoadTableGcsCsv(_projectId, datasetId); var output = _stringOut.ToString(); long numRows = Convert.ToInt64(Regex.Match(output, @"\d+").Value); Assert.Equal(50, numRows); } [Fact] public void TestLoadTableGcsJson() { var snippet = new BigQueryLoadTableGcsJson(); var datasetId = CreateTempDataset(); snippet.LoadTableGcsJson(_projectId, datasetId); var output = _stringOut.ToString(); long numRows = Convert.ToInt64(Regex.Match(output, @"\d+").Value); Assert.Equal(50, numRows); } [Fact] public void TestLoadTableGcsOrc() { var snippet = new BigQueryLoadTableGcsOrc(); var datasetId = CreateTempDataset(); snippet.LoadTableGcsOrc(_projectId, datasetId); var truncateSnippet = new BigQueryLoadTableGcsOrcTruncate(); truncateSnippet.LoadTableGcsOrcTruncate( _projectId, datasetId, "us_states"); var output = _stringOut.ToString(); // Snippet runs should report 50 output rows twice Assert.Equal(2, Regex.Matches(output, "50").Count); } [Fact] public void TestQuery() { var snippet = new BigQueryQuery(); snippet.Query(_projectId); var outputLines = _stringOut.ToString().Trim().Split(Environment.NewLine); Assert.Equal(100, outputLines.Count()); } [Fact] public void TestQueryLegacy() { var snippet = new BigQueryQueryLegacy(); snippet.QueryLegacy(_projectId); var outputLines = _stringOut.ToString().Trim().Split(Environment.NewLine); Assert.Equal(100, outputLines.Count()); } [Fact] public void TestQueryWithArrayParameters() { var snippet = new BigQueryQueryWithArrayParameters(); snippet.QueryWithArrayParameters(_projectId); var outputLines = _stringOut.ToString().Trim().Split(Environment.NewLine); Assert.Equal(10, outputLines.Count()); } [Fact] public void TestQueryWithNamedParameters() { var snippet = new BigQueryQueryWithNamedParameters(); snippet.QueryWithNamedParameters(_projectId); var outputLines = _stringOut.ToString().Trim().Split(Environment.NewLine); Assert.Equal(12, outputLines.Count()); } [Fact] public void TestQueryWithPositionalParameters() { var snippet = new BigQueryQueryWithPositionalParameters(); snippet.QueryWithPositionalParameters(_projectId); var outputLines = _stringOut.ToString().Trim().Split(Environment.NewLine); Assert.Equal(12, outputLines.Length); } [Fact] public void TestQueryWithTimestampParameters() { var snippet = new BigQueryQueryWithTimestampParameters(); snippet.QueryWithTimestampParameters(_projectId); var outputLines = _stringOut.ToString().Trim().Split(Environment.NewLine); Assert.Single(outputLines); } [Fact] public void TestTableInsertRows() { var snippet = new BigQueryTableInsertRows(); var datasetId = CreateTempDataset(); var tableId = CreateTempUsStatesTable(datasetId); snippet.TableInsertRows(_projectId, datasetId, tableId); } public string CreateTempDataset() { string datasetId = TestUtil.RandomName(); BigQueryDataset tempDataset = _client.CreateDataset( datasetId, new Dataset { Location = "US" }); _tempDatasets.Add(tempDataset); return datasetId; } public string CreateTempEmptyTable(string datasetId) { string tableId = TestUtil.RandomName(); _client.CreateTable(datasetId, tableId, new Table()); return tableId; } public string CreateTempUsStatesTable(string datasetId) { var snippet = new BigQueryLoadTableGcsCsv(); snippet.LoadTableGcsCsv(_projectId, datasetId); return "us_states"; // The table ID defined in the snippet } public void Dispose() { foreach (BigQueryDataset dataset in _tempDatasets) { var deleteDatasetOptions = new DeleteDatasetOptions() { DeleteContents = true }; dataset.Delete(deleteDatasetOptions); } Console.SetOut(_consoleOut); } }