firestore/api/FirestoreTest/FirestoreTest.cs (778 lines of code) (raw):
/*
* Copyright (c) 2018 Google Inc.
*
* 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.Auth.OAuth2;
using Google.Cloud.Firestore;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Xunit;
namespace GoogleCloudSamples
{
public class FirestoreFixture : IDisposable
{
// Clean-up function to delete all documents in a collection
private static async Task DeleteCollection(string collection)
{
FirestoreDb db = FirestoreDb.Create(Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
CollectionReference collectionReference = db.Collection(collection);
QuerySnapshot snapshot = await collectionReference.GetSnapshotAsync();
IReadOnlyList<DocumentSnapshot> documents = snapshot.Documents;
foreach (DocumentSnapshot document in documents)
{
await document.Reference.DeleteAsync();
}
}
// Clean-up function to delete all indexes in a collection
private static async Task DeleteIndexes(string collection)
{
GoogleCredential credential =
GoogleCredential.GetApplicationDefault();
//Inject the Cloud Platform scope if required.
if (credential.IsCreateScopedRequired)
{
credential = credential.CreateScoped(new[]
{
"https://www.googleapis.com/auth/cloud-platform"
});
}
HttpClient http = new Google.Apis.Http.HttpClientFactory()
.CreateHttpClient(
new Google.Apis.Http.CreateHttpClientArgs()
{
ApplicationName = "Google Cloud Platform Firestore Sample",
GZipEnabled = true,
Initializers = { credential },
});
string uriString = "https://firestore.googleapis.com/v1beta1/projects/"
+ Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID")
+ "/databases/(default)/indexes";
UriBuilder uri = new UriBuilder(uriString);
var resultText = http.GetAsync(uri.Uri).Result.Content
.ReadAsStringAsync().Result;
dynamic result = Newtonsoft.Json.JsonConvert
.DeserializeObject(resultText);
List<string> indexesToBeDeleted = new List<string>();
if (result.indexes != null)
{
foreach (var index in result.indexes)
{
if (index.collection == collection)
{
string name = index.name;
indexesToBeDeleted.Add(name);
}
}
}
foreach (string indexToBeDeleted in indexesToBeDeleted)
{
uriString = "https://firestore.googleapis.com/v1beta1/" + indexToBeDeleted;
UriBuilder deleteUri = new UriBuilder(uriString);
await http.DeleteAsync(deleteUri.Uri);
}
}
// Clean up function to delete all collections and indexes after testing is complete
public void Dispose()
{
DeleteCollection("users").Wait();
DeleteCollection("cities/SF/neighborhoods").Wait();
DeleteCollection("cities").Wait();
DeleteCollection("data").Wait();
DeleteIndexes("cities").Wait();
}
}
public class FirestoreTests : IClassFixture<FirestoreFixture>
{
readonly CommandLineRunner _quickstart = new CommandLineRunner()
{
VoidMain = Quickstart.Main,
Command = "dotnet run"
};
protected ConsoleOutput RunQuickstart(params string[] args)
{
return _quickstart.Run(args);
}
readonly CommandLineRunner _addData = new CommandLineRunner()
{
VoidMain = AddData.Main,
Command = "dotnet run"
};
protected ConsoleOutput RunAddData(params string[] args)
{
return _addData.Run(args);
}
readonly CommandLineRunner _deleteData = new CommandLineRunner()
{
VoidMain = DeleteData.Main,
Command = "dotnet run"
};
protected ConsoleOutput RunDeleteData(params string[] args)
{
return _deleteData.Run(args);
}
readonly CommandLineRunner _getData = new CommandLineRunner()
{
VoidMain = GetData.Main,
Command = "dotnet run"
};
protected ConsoleOutput RunGetData(params string[] args)
{
return _getData.Run(args);
}
readonly CommandLineRunner _listenData = new CommandLineRunner()
{
VoidMain = ListenData.Main,
Command = "dotnet run"
};
protected ConsoleOutput RunListenData(params string[] args)
{
return _listenData.Run(args);
}
readonly CommandLineRunner _queryData = new CommandLineRunner()
{
VoidMain = QueryData.Main,
Command = "dotnet run"
};
protected ConsoleOutput RunQueryData(params string[] args)
{
return _queryData.Run(args);
}
readonly CommandLineRunner _orderLimitData = new CommandLineRunner()
{
VoidMain = OrderLimitData.Main,
Command = "dotnet run"
};
protected ConsoleOutput RunOrderLimitData(params string[] args)
{
return _orderLimitData.Run(args);
}
readonly CommandLineRunner _dataModel = new CommandLineRunner()
{
VoidMain = DataModel.Main,
Command = "dotnet run"
};
protected ConsoleOutput RunDataModel(params string[] args)
{
return _dataModel.Run(args);
}
readonly CommandLineRunner _transactionsAndBatchedWrites = new CommandLineRunner()
{
VoidMain = TransactionsAndBatchedWrites.Main,
Command = "dotnet run"
};
protected ConsoleOutput RunTransactionsAndBatchedWrites(params string[] args)
{
return _transactionsAndBatchedWrites.Run(args);
}
readonly CommandLineRunner _paginateData = new CommandLineRunner()
{
VoidMain = PaginateData.Main,
Command = "dotnet run"
};
protected ConsoleOutput RunPaginateData(params string[] args)
{
return _paginateData.Run(args);
}
readonly CommandLineRunner _manageIndexes = new CommandLineRunner()
{
VoidMain = ManageIndexes.Main,
Command = "dotnet run"
};
protected ConsoleOutput RunManageIndexes(params string[] args)
{
return _manageIndexes.Run(args);
}
readonly CommandLineRunner _distrubutedCounter = new CommandLineRunner()
{
VoidMain = DistributedCounter.Main,
Command = "dotnet run"
};
protected ConsoleOutput RunDistributedCounter(params string[] args)
{
return _distrubutedCounter.Run(args);
}
// QUICKSTART TESTS
[Fact]
public void InitializeProjectIdTest()
{
var output = RunQuickstart("initialize-project-id", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Created Cloud Firestore client with project ID:", output.Stdout);
}
[Fact]
public void AddData1Test()
{
var output = RunQuickstart("add-data-1", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Added data to the alovelace document in the users collection.", output.Stdout);
}
[Fact]
public void AddData2Test()
{
var output = RunQuickstart("add-data-2", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Added data to the aturing document in the users collection.", output.Stdout);
}
[Fact]
public void RetrieveAllDocumentsTest()
{
RunQuickstart("add-data-1", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
RunQuickstart("add-data-2", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunQuickstart("retrieve-all-documents", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("User: alovelace", output.Stdout);
Assert.Contains("First: Ada", output.Stdout);
Assert.Contains("Last: Lovelace", output.Stdout);
Assert.Contains("Born: 1815", output.Stdout);
Assert.Contains("User: aturing", output.Stdout);
Assert.Contains("First: Alan", output.Stdout);
Assert.Contains("Middle: Mathison", output.Stdout);
Assert.Contains("Last: Turing", output.Stdout);
Assert.Contains("Born: 1912", output.Stdout);
}
// ADD DATA TESTS
[Fact]
public void AddDocAsMapTest()
{
var output = RunAddData("add-doc-as-map", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Added data to the LA document in the cities collection.", output.Stdout);
}
[Fact]
public void UpdateCreateIfMissingTest()
{
var output = RunAddData("update-create-if-missing", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Merged data into the LA document in the cities collection.", output.Stdout);
}
[Fact]
public void AddDocDataTypesTest()
{
var output = RunAddData("add-doc-data-types", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Set multiple data-type data for the one document in the data collection.", output.Stdout);
}
[Fact]
public void AddSimpleDocAsEntityTest()
{
var output = RunAddData("add-simple-doc-as-entity", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Added custom City object to the cities collection.", output.Stdout);
}
[Fact]
public void SetRequiresIdTest()
{
var output = RunAddData("set-requires-id", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Added document with ID: new-city-id.", output.Stdout);
}
[Fact]
public void AddDocDataWithAutoIdTest()
{
var output = RunAddData("add-doc-data-with-auto-id", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Added document with ID:", output.Stdout);
}
[Fact]
public void AddDocDataAfterAutoIdTest()
{
var output = RunAddData("add-doc-data-after-auto-id", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Added document with ID:", output.Stdout);
Assert.Contains("Added data to the", output.Stdout);
Assert.Contains("document in the cities collection.", output.Stdout);
}
[Fact]
public void UpdateDocTest()
{
RunAddData("set-requires-id", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunAddData("update-doc", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Updated the Capital field of the new-city-id document in the cities collection.", output.Stdout);
}
[Fact]
public void UpdateNestedFieldsTest()
{
var output = RunAddData("update-nested-fields", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Updated the age and favorite color fields of the Frank document in the users collection.", output.Stdout);
}
[Fact]
public void UpdateServerTimestampTest()
{
RunAddData("set-requires-id", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunAddData("update-server-timestamp", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Updated the Timestamp field of the new-city-id document in the cities collection.", output.Stdout);
}
[Fact]
public void UpdateDocumentArrayTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunAddData("update-document-array", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Updated the Regions array of the DC document in the cities collection.", output.Stdout);
}
[Fact]
public void UpdateDocumentIncrementTest()
{
RunQueryData("update-document-increment", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunAddData("update-document-increment", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Updated the population of the DC document in the cities collection.", output.Stdout);
}
// DELETE DATA TESTS
[Fact]
public void DeleteDocTest()
{
RunGetData("retrieve-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunDeleteData("delete-doc", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Deleted the DC document in the cities collection.", output.Stdout);
}
[Fact]
public void DeleteFieldTest()
{
RunGetData("retrieve-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunDeleteData("delete-field", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Deleted the Capital field from the BJ document in the cities collection.", output.Stdout);
}
[Fact]
public void DeleteCollectionTest()
{
RunGetData("retrieve-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunDeleteData("delete-collection", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Deleting document BJ", output.Stdout);
Assert.Contains("Deleting document LA", output.Stdout);
Assert.Contains("Deleting document TOK", output.Stdout);
Assert.Contains("Deleting document SF", output.Stdout);
Assert.Contains("Finished deleting all documents from the collection.", output.Stdout);
}
// GET DATA TESTS
[Fact]
public void RetrieveCreateExamplesTest()
{
var output = RunGetData("retrieve-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Added example cities data to the cities collection.", output.Stdout);
}
[Fact]
public void GetDocAsMapTest()
{
RunGetData("retrieve-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunGetData("get-doc-as-map", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document data for SF document:", output.Stdout);
Assert.Contains("Name: San Francisco", output.Stdout);
Assert.Contains("State: CA", output.Stdout);
Assert.Contains("Country: USA", output.Stdout);
Assert.Contains("Capital: False", output.Stdout);
Assert.Contains("Population: 860000", output.Stdout);
}
[Fact]
public void GetDocAsEntityTest()
{
RunGetData("retrieve-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunGetData("get-doc-as-entity", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document data for BJ document:", output.Stdout);
Assert.Contains("State:", output.Stdout);
Assert.Contains("Country: China", output.Stdout);
Assert.Contains("Capital: True", output.Stdout);
Assert.Contains("Population: 21500000", output.Stdout);
}
[Fact]
public void GetMultipleDocsTest()
{
RunGetData("retrieve-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunGetData("get-multiple-docs", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document data for DC document:", output.Stdout);
Assert.Contains("Document data for TOK document:", output.Stdout);
Assert.Contains("Document data for BJ document:", output.Stdout);
Assert.DoesNotContain("Document data for SF document:", output.Stdout);
Assert.DoesNotContain("Document data for LA document:", output.Stdout);
Assert.Contains("Name: Tokyo", output.Stdout);
Assert.Contains("State:", output.Stdout);
Assert.Contains("Country: Japan", output.Stdout);
Assert.Contains("Capital: True", output.Stdout);
Assert.Contains("Population: 9000000", output.Stdout);
}
[Fact]
public void GetAllDocsTest()
{
RunGetData("retrieve-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunGetData("get-all-docs", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document data for BJ document:", output.Stdout);
Assert.Contains("Document data for DC document:", output.Stdout);
Assert.Contains("Document data for LA document:", output.Stdout);
Assert.Contains("Document data for SF document:", output.Stdout);
Assert.Contains("Document data for TOK document:", output.Stdout);
Assert.Contains("Name: Los Angeles", output.Stdout);
Assert.Contains("State: CA", output.Stdout);
Assert.Contains("Country: USA", output.Stdout);
Assert.Contains("Capital: False", output.Stdout);
Assert.Contains("Population: 3900000", output.Stdout);
}
[Fact]
public void GetCollectionsTest()
{
RunGetData("retrieve-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var addSubcollectionOutput = RunGetData("add-subcollection", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Added data to the Marina document in the neighborhoods subcollection in the SF document in the cities collection.", addSubcollectionOutput.Stdout);
var getCollectionsOutput = RunGetData("get-collections", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Found subcollection with ID: neighborhoods", getCollectionsOutput.Stdout);
}
// LISTEN DATA TESTS
[Fact]
public void ListenDocumentTest()
{
RunDeleteData("delete-collection", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var listenDocumentOutput = RunListenData("listen-document", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Callback received document snapshot.", listenDocumentOutput.Stdout);
Assert.Contains("Document exists? True", listenDocumentOutput.Stdout);
Assert.Contains("Document data for SF document:", listenDocumentOutput.Stdout);
Assert.Contains("Name: San Francisco", listenDocumentOutput.Stdout);
Assert.Contains("State: CA", listenDocumentOutput.Stdout);
Assert.Contains("Country: USA", listenDocumentOutput.Stdout);
Assert.Contains("Capital: False", listenDocumentOutput.Stdout);
Assert.Contains("Population: 860000", listenDocumentOutput.Stdout);
Assert.Contains("Stopping the listener", listenDocumentOutput.Stdout);
}
[Fact]
public void ListenMultipleTest()
{
RunDeleteData("delete-collection", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var listenMultipleOutput = RunListenData("listen-multiple", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Creating document", listenMultipleOutput.Stdout);
Assert.Contains("Callback received query snapshot.", listenMultipleOutput.Stdout);
Assert.Contains("Current cities in California:", listenMultipleOutput.Stdout);
Assert.Contains("LA", listenMultipleOutput.Stdout);
Assert.Contains("Stopping the listener", listenMultipleOutput.Stdout);
}
[Fact]
public void ListenForChangesTest()
{
RunDeleteData("delete-collection", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var listenForChangesOutput = RunListenData("listen-for-changes", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Creating document", listenForChangesOutput.Stdout);
Assert.Contains("New city: MTV", listenForChangesOutput.Stdout);
Assert.Contains("Modifying document", listenForChangesOutput.Stdout);
Assert.Contains("Modified city: MTV", listenForChangesOutput.Stdout);
Assert.Contains("Deleting document", listenForChangesOutput.Stdout);
Assert.Contains("Removed city: MTV", listenForChangesOutput.Stdout);
Assert.Contains("Stopping the listener", listenForChangesOutput.Stdout);
}
// QUERY DATA TESTS
[Fact]
public void QueryCreateExamplesTest()
{
var output = RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Added example cities data to the cities collection.", output.Stdout);
}
[Fact]
public void CreateQueryStateTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunQueryData("create-query-state", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document LA returned by query State=CA", output.Stdout);
Assert.Contains("Document SF returned by query State=CA", output.Stdout);
Assert.DoesNotContain("Document DC returned by query State=CA", output.Stdout);
Assert.DoesNotContain("Document TOK returned by query State=CA", output.Stdout);
Assert.DoesNotContain("Document BJ returned by query State=CA", output.Stdout);
}
[Fact]
public void CreateQueryCapitalTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunQueryData("create-query-capital", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document DC returned by query Capital=true", output.Stdout);
Assert.Contains("Document TOK returned by query Capital=true", output.Stdout);
Assert.Contains("Document BJ returned by query Capital=true", output.Stdout);
Assert.DoesNotContain("Document SF returned by query Capital=true", output.Stdout);
Assert.DoesNotContain("Document LA returned by query Capital=true", output.Stdout);
}
[Fact]
public void SimpleQueriesTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunQueryData("simple-queries", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document LA returned by query State=CA", output.Stdout);
Assert.Contains("Document SF returned by query State=CA", output.Stdout);
Assert.DoesNotContain("Document DC returned by query State=CA", output.Stdout);
Assert.DoesNotContain("Document TOK returned by query State=CA", output.Stdout);
Assert.DoesNotContain("Document BJ returned by query State=CA", output.Stdout);
Assert.Contains("Document LA returned by query Population>1000000", output.Stdout);
Assert.Contains("Document TOK returned by query Population>1000000", output.Stdout);
Assert.Contains("Document BJ returned by query Population>1000000", output.Stdout);
Assert.DoesNotContain("Document SF returned by query Population>1000000", output.Stdout);
Assert.DoesNotContain("Document DC returned by query Population>1000000", output.Stdout);
Assert.Contains("Document SF returned by query Name>=San Francisco", output.Stdout);
Assert.Contains("Document TOK returned by query Name>=San Francisco", output.Stdout);
Assert.Contains("Document DC returned by query Name>=San Francisco", output.Stdout);
Assert.DoesNotContain("Document LA returned by query Name>=San Francisco", output.Stdout);
Assert.DoesNotContain("Document BJ returned by query Name>=San Francisco", output.Stdout);
}
[Fact]
public void ArrayContainsQueryTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunQueryData("array-contains-query", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document LA returned by query 'Regions array_contains west_coast'", output.Stdout);
Assert.Contains("Document SF returned by query 'Regions array_contains west_coast'", output.Stdout);
Assert.DoesNotContain("Document DC returned by query 'Regions array_contains west_coast'", output.Stdout);
Assert.DoesNotContain("Document TOK returned by query 'Regions array_contains west_coast'", output.Stdout);
Assert.DoesNotContain("Document BJ returned by query 'Regions array_contains west_coast'", output.Stdout);
}
[Fact]
public void ArrayContainsQueryAnyTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunQueryData("array-contains-any-query", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document SF returned by query 'Regions array_contains_any {west_coast, east_coast}'", output.Stdout);
Assert.Contains("Document LA returned by query 'Regions array_contains_any {west_coast, east_coast}'", output.Stdout);
Assert.Contains("Document DC returned by query 'Regions array_contains_any {west_coast, east_coast}'", output.Stdout);
Assert.DoesNotContain("Document TOK returned by query 'Regions array_contains_any {west_coast, east_coast}'", output.Stdout);
Assert.DoesNotContain("Document BJ returned by query 'Regions array_contains west_coast'", output.Stdout);
}
[Fact]
public void InQueryWithoutArrayTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
// Expected: "SF", "LA", "DC", "TOK"
var output = RunQueryData("in-query", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document SF returned by query 'Country in {USA, Japan}'", output.Stdout);
Assert.Contains("Document LA returned by query 'Country in {USA, Japan}'", output.Stdout);
Assert.Contains("Document DC returned by query 'Country in {USA, Japan}'", output.Stdout);
Assert.Contains("Document TOK returned by query 'Country in {USA, Japan}'", output.Stdout);
Assert.DoesNotContain("Document BJ returned by query 'Country in {USA, Japan}'", output.Stdout);
}
[Fact]
public void InQueryWithArrayTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
// Expected: "DC"
var output = RunQueryData("in-query-array", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document DC returned by query 'Regions in {west_coast}, {east_coast}'", output.Stdout);
Assert.DoesNotContain("Document LA returned by query 'Regions in {west_coast}, {east_coast}'", output.Stdout);
Assert.DoesNotContain("Document SF returned by query 'Regions in {west_coast}, {east_coast}'", output.Stdout);
Assert.DoesNotContain("Document TOK returned by query 'Regions in {west_coast}, {east_coast}'", output.Stdout);
Assert.DoesNotContain("Document BJ returned by query 'Regions in {west_coast}, {east_coast}'", output.Stdout);
}
[Fact]
public void ChainedQueryTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunQueryData("chained-query", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document SF returned by query State=CA and Name=San Francisco", output.Stdout);
Assert.DoesNotContain("Document LA returned by query State=CA and Name=San Francisco", output.Stdout);
Assert.DoesNotContain("Document DC returned by query State=CA and Name=San Francisco", output.Stdout);
Assert.DoesNotContain("Document TOK returned by query State=CA and Name=San Francisco", output.Stdout);
Assert.DoesNotContain("Document BJ returned by query State=CA and Name=San Francisco", output.Stdout);
}
[Fact(Skip = "b/137857855")]
public void CompositeIndexChainedQueryTest()
{
var manageIndexesOutput = RunManageIndexes("create-indexes", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
if (!manageIndexesOutput.Stdout.Contains("completed"))
{
var numIndexesCreatedOutput = RunManageIndexes("count-indexes", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
int numIndexesCreated = numIndexesCreatedOutput.Stdout.Split('\n').Length;
while (numIndexesCreated < 3)
{
numIndexesCreatedOutput = RunManageIndexes("count-indexes", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
numIndexesCreated = numIndexesCreatedOutput.Stdout.Split('\n').Length;
}
}
Assert.Contains("Index creation completed!", manageIndexesOutput.Stdout);
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunQueryData("composite-index-chained-query", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document SF returned by query State=CA and Population<1000000", output.Stdout);
Assert.DoesNotContain("Document LA returned by query State=CA and Population<1000000", output.Stdout);
Assert.DoesNotContain("Document DC returned by query State=CA and Population<1000000", output.Stdout);
Assert.DoesNotContain("Document TOK returned by query State=CA and Population<1000000", output.Stdout);
Assert.DoesNotContain("Document BJ returned by query State=CA and Population<1000000", output.Stdout);
}
[Fact]
public void RangeQueryTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunQueryData("range-query", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document LA returned by query CA<=State<=IN", output.Stdout);
Assert.Contains("Document SF returned by query CA<=State<=IN", output.Stdout);
Assert.DoesNotContain("Document DC returned by query CA<=State<=IN", output.Stdout);
Assert.DoesNotContain("Document TOK returned by query CA<=State<=IN", output.Stdout);
Assert.DoesNotContain("Document BJ returned by query CA<=State<=IN", output.Stdout);
}
[Fact]
public void InvalidRangeQueryTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunQueryData("invalid-range-query", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
}
[Fact]
public void SubcollectionQueryTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunQueryData("subcollection-query", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains(": Golden Gate Bridge", output.Stdout);
}
[Fact]
public void MultipleInequalitiesQueryTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunQueryData("multiple-inequalities", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Los Angeles", output.Stdout);
Assert.Contains("Beijing", output.Stdout);
}
// ORDER LIMIT DATA TESTS
[Fact]
public void OrderByNameLimitQueryTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunOrderLimitData("order-by-name-limit-query", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document BJ returned by order by name with limit query", output.Stdout);
Assert.Contains("Document LA returned by order by name with limit query", output.Stdout);
Assert.Contains("Document SF returned by order by name with limit query", output.Stdout);
Assert.DoesNotContain("Document DC returned by order by name with limit query", output.Stdout);
Assert.DoesNotContain("Document TOK returned by order by name with limit query", output.Stdout);
}
[Fact]
public void OrderByNameDescLimitQueryTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunOrderLimitData("order-by-name-desc-limit-query", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document DC returned by order by name descending with limit query", output.Stdout);
Assert.Contains("Document TOK returned by order by name descending with limit query", output.Stdout);
Assert.Contains("Document SF returned by order by name descending with limit query", output.Stdout);
Assert.DoesNotContain("Document LA returned by order by name descending with limit query", output.Stdout);
Assert.DoesNotContain("Document BJ returned by order by name descending with limit query", output.Stdout);
}
[Fact(Skip = "b/137857855")]
public void OrderByStateAndPopulationQueryTest()
{
var manageIndexesOutput = RunManageIndexes("create-indexes", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
if (!manageIndexesOutput.Stdout.Contains("completed"))
{
var numIndexesCreatedOutput = RunManageIndexes("count-indexes", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
int numIndexesCreated = numIndexesCreatedOutput.Stdout.Split('\n').Length;
while (numIndexesCreated < 3)
{
numIndexesCreatedOutput = RunManageIndexes("count-indexes", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
numIndexesCreated = numIndexesCreatedOutput.Stdout.Split('\n').Length;
}
}
Assert.Contains("Index creation completed!", manageIndexesOutput.Stdout);
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunOrderLimitData("order-by-state-and-population-query", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document LA returned by order by state and descending population query", output.Stdout);
Assert.Contains("Document SF returned by order by state and descending population query", output.Stdout);
Assert.Contains("Document BJ returned by order by state and descending population query", output.Stdout);
Assert.Contains("Document DC returned by order by state and descending population query", output.Stdout);
Assert.Contains("Document TOK returned by order by state and descending population query", output.Stdout);
}
[Fact]
public void WhereOrderByLimitQueryTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunOrderLimitData("where-order-by-limit-query", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document LA returned by where order by limit query", output.Stdout);
Assert.Contains("Document TOK returned by where order by limit query", output.Stdout);
Assert.DoesNotContain("Document SF returned by where order by limit query", output.Stdout);
Assert.DoesNotContain("Document DC returned by where order by limit query", output.Stdout);
Assert.DoesNotContain("Document BJ returned by where order by limit query", output.Stdout);
}
[Fact]
public void RangeOrderByQueryTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunOrderLimitData("range-order-by-query", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document LA returned by range with order by query", output.Stdout);
Assert.Contains("Document TOK returned by range with order by query", output.Stdout);
Assert.Contains("Document BJ returned by range with order by query", output.Stdout);
Assert.DoesNotContain("Document SF returned by range with order by query", output.Stdout);
Assert.DoesNotContain("Document DC returned by range with order by query", output.Stdout);
}
[Fact]
public void InvalidRangeOrderByQueryTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunOrderLimitData("invalid-range-order-by-query", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
}
// DATA MODEL TESTS
[Fact]
public void DocumentRefTest()
{
RunDataModel("document-ref", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
}
[Fact]
public void CollectionRefTest()
{
RunDataModel("collection-ref", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
}
[Fact]
public void DocumentPathRefTest()
{
RunDataModel("document-path-ref", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
}
[Fact]
public void SubcollectionRefTest()
{
RunDataModel("subcollection-ref", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
}
// TRANSACTIONS AND BATCHED WRITES TESTS
[Fact]
public void RunSimpleTransactionTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunTransactionsAndBatchedWrites("run-simple-transaction", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Ran a simple transaction to update the population field in the SF document in the cities collection.", output.Stdout);
}
[Fact]
public void ReturnInfoTransactionTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunTransactionsAndBatchedWrites("return-info-transaction", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Population updated successfully.", output.Stdout);
}
[Fact]
public void BatchWriteTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunTransactionsAndBatchedWrites("batch-write", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Batch write successfully completed.", output.Stdout);
}
// PAGINATE DATA TESTS
[Fact]
public void StartAtFieldQueryCursorTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunPaginateData("start-at-field-query-cursor", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document LA returned by start at population 1000000 field query cursor", output.Stdout);
Assert.Contains("Document TOK returned by start at population 1000000 field query cursor", output.Stdout);
Assert.Contains("Document BJ returned by start at population 1000000 field query cursor", output.Stdout);
Assert.DoesNotContain("Document SF returned by start at population 1000000 field query cursor", output.Stdout);
Assert.DoesNotContain("Document DC returned by start at population 1000000 field query cursor", output.Stdout);
}
[Fact]
public void EndAtFieldQueryCursorTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunPaginateData("end-at-field-query-cursor", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document DC returned by end at population 1000000 field query cursor", output.Stdout);
Assert.Contains("Document SF returned by end at population 1000000 field query cursor", output.Stdout);
Assert.DoesNotContain("Document LA returned by end at population 1000000 field query cursor", output.Stdout);
Assert.DoesNotContain("Document TOK returned by end at population 1000000 field query cursor", output.Stdout);
Assert.DoesNotContain("Document BJ returned by end at population 1000000 field query cursor", output.Stdout);
}
[Fact]
public void DocumentSnapshotCursorTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunPaginateData("document-snapshot-cursor", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.DoesNotContain("Document DC returned by query for cities with population greater than or equal to SF.", output.Stdout);
Assert.Contains("Document SF returned by query for cities with population greater than or equal to SF.", output.Stdout);
Assert.Contains("Document LA returned by query for cities with population greater than or equal to SF.", output.Stdout);
Assert.Contains("Document TOK returned by query for cities with population greater than or equal to SF.", output.Stdout);
Assert.Contains("Document BJ returned by query for cities with population greater than or equal to SF.", output.Stdout);
}
[Fact]
public void PaginatedQueryCursorTest()
{
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
var output = RunPaginateData("paginated-query-cursor", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Document TOK returned by paginated query cursor.", output.Stdout);
Assert.Contains("Document BJ returned by paginated query cursor.", output.Stdout);
Assert.DoesNotContain("Document SF returned by paginated query cursor.", output.Stdout);
Assert.DoesNotContain("Document LA returned by paginated query cursor.", output.Stdout);
Assert.DoesNotContain("Document DC returned by paginated query cursor.", output.Stdout);
}
[Fact(Skip = "b/137857855")]
public void MultipleCursorConditionsTest()
{
var manageIndexesOutput = RunManageIndexes("create-indexes", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
if (!manageIndexesOutput.Stdout.Contains("completed"))
{
var numIndexesCreatedOutput = RunManageIndexes("count-indexes", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
int numIndexesCreated = numIndexesCreatedOutput.Stdout.Split('\n').Length;
while (numIndexesCreated < 3)
{
numIndexesCreatedOutput = RunManageIndexes("count-indexes", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
numIndexesCreated = numIndexesCreatedOutput.Stdout.Split('\n').Length;
}
}
Assert.Contains("Index creation completed!", manageIndexesOutput.Stdout);
RunQueryData("query-create-examples", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
RunPaginateData("multiple-cursor-conditions", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
}
[Fact]
public void RunDistributedCounterTest()
{
var output = RunDistributedCounter("distributed-counter", Environment.GetEnvironmentVariable("FIRESTORE_PROJECT_ID"));
Assert.Contains("Distributed counter created.", output.Stdout);
Assert.Contains("Distributed counter incremented.", output.Stdout);
Assert.Contains("Total count: 1", output.Stdout);
}
}
}