public async Task SingleHttpHandlerConstructor() { TestHttpHandler hijack = new TestHttpHandler(); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, handlers: hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); // Ensure properties are copied over Assert.AreEqual(MobileAppUriValidator.DummyMobileApp, service.MobileAppUri.ToString()); // Set the handler to return an empty array hijack.SetResponseContent("[]"); JToken response = await service.GetTable("foo").ReadAsync("bar"); // Verify the handler was in the loop Assert.StartsWith(hijack.Request.RequestUri.ToString(), mobileAppUriValidator.TableBaseUri); }
public async Task ReadAsync_WithAbsoluteUri_Generic() { var data = new[] { new { ServiceUri = MobileAppUriValidator.DummyMobileApp, Result = MobileAppUriValidator.DummyMobileApp + "about?$filter=a eq b&$orderby=c" }, new { ServiceUri = MobileAppUriValidator.DummyMobileAppWithoutTralingSlash, Result = MobileAppUriValidator.DummyMobileAppWithoutTralingSlash + "/about?$filter=a eq b&$orderby=c" }, new { ServiceUri = MobileAppUriValidator.DummyMobileAppUriWithFolder, Result = MobileAppUriValidator.DummyMobileAppUriWithFolder + "about?$filter=a eq b&$orderby=c" }, new { ServiceUri = MobileAppUriValidator.DummyMobileAppUriWithFolderWithoutTralingSlash, Result = MobileAppUriValidator.DummyMobileAppUriWithFolderWithoutTralingSlash + "/about?$filter=a eq b&$orderby=c" }, }; foreach (var item in data) { var hijack = new TestHttpHandler(); hijack.SetResponseContent("[{\"col1\":\"Hey\"}]"); IMobileServiceClient service = new MobileServiceClient(item.ServiceUri, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable<ToDo> table = service.GetTable<ToDo>(); await table.ReadAsync<ToDo>(item.Result); Assert.AreEqual("TT,LH", hijack.Request.Headers.GetValues("X-ZUMO-FEATURES").First()); Assert.AreEqual(item.Result, hijack.Request.RequestUri.ToString()); } }
public async Task PullAsync_DefaultsTo50_IfGreaterThanMaxPageSize() { var hijack = new TestHttpHandler(); hijack.AddResponseContent("[{\"id\":\"abc\",\"String\":\"Hey\"},{\"id\":\"def\",\"String\":\"How\"}]"); // first page hijack.AddResponseContent("[]"); // end of the list var store = new MobileServiceLocalStoreMock(); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler()); IMobileServiceSyncTable<ToDoWithStringId> table = service.GetSyncTable<ToDoWithStringId>(); Assert.IsFalse(store.TableMap.ContainsKey("stringId_test_table")); var pullOptions = new PullOptions { MaxPageSize = 50, }; await table.PullAsync(null, table.Take(51), pullOptions); Assert.AreEqual(store.TableMap["stringId_test_table"].Count, 2); AssertEx.MatchUris(hijack.Requests, mobileAppUriValidator.GetTableUri("stringId_test_table?$skip=0&$top=50&__includeDeleted=true"), mobileAppUriValidator.GetTableUri("stringId_test_table?$skip=2&$top=49&__includeDeleted=true")); }
public async Task InvokeCustomAPIWithEmptyStringResponse_Success() { TestHttpHandler hijack = new TestHttpHandler(); hijack.Response = new HttpResponseMessage(System.Net.HttpStatusCode.OK); hijack.Response.Content = new StringContent("", Encoding.UTF8, "application/json"); MobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); JToken expected = await service.InvokeApiAsync("testapi"); Assert.AreEqual(hijack.Request.RequestUri.LocalPath, mobileAppUriValidator.GetApiUriPath("testapi")); Assert.AreEqual(expected, null); }
public async Task InvokeCustomAPIGetJToken() { TestHttpHandler hijack = new TestHttpHandler(); hijack.SetResponseContent("{\"id\":3}"); MobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); JToken expected = await service.InvokeApiAsync("calculator/add?a=1&b=2", HttpMethod.Get, null); Assert.AreEqual(hijack.Request.RequestUri.LocalPath, mobileAppUriValidator.GetApiUriPath("calculator/add")); Assert.AreEqual(hijack.Request.RequestUri.Query, "?a=1&b=2"); Assert.AreEqual(3, (int)expected["id"]); }
public async Task ErrorMessageConstruction() { string appUrl = MobileAppUriValidator.DummyMobileApp; string collection = "tests"; string query = "$filter=id eq 12"; TestHttpHandler hijack = new TestHttpHandler(); IMobileServiceClient service = new MobileServiceClient(appUrl, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); // Verify the error message is correctly pulled out hijack.SetResponseContent("{\"error\":\"error message\",\"other\":\"donkey\"}"); hijack.Response.StatusCode = HttpStatusCode.Unauthorized; hijack.Response.ReasonPhrase = "YOU SHALL NOT PASS."; try { JToken response = await service.GetTable(collection).ReadAsync(query); } catch (InvalidOperationException ex) { Assert.AreEqual(ex.Message, "error message"); } // Verify all of the exception parameters hijack.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized); hijack.Response.Content = new StringContent("{\"error\":\"error message\",\"other\":\"donkey\"}", Encoding.UTF8, "application/json"); hijack.Response.ReasonPhrase = "YOU SHALL NOT PASS."; try { JToken response = await service.GetTable(collection).ReadAsync(query); } catch (MobileServiceInvalidOperationException ex) { Assert.AreEqual(ex.Message, "error message"); Assert.AreEqual(HttpStatusCode.Unauthorized, ex.Response.StatusCode); Assert.Contains(ex.Response.Content.ReadAsStringAsync().Result, "donkey"); Assert.StartsWith(ex.Request.RequestUri.ToString(), mobileAppUriValidator.TableBaseUri); Assert.AreEqual("YOU SHALL NOT PASS.", ex.Response.ReasonPhrase); } // If no error message in the response, we'll use the // StatusDescription instead hijack.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized); hijack.Response.Content = new StringContent("{\"error\":\"error message\",\"other\":\"donkey\"}", Encoding.UTF8, "application/json"); hijack.Response.ReasonPhrase = "YOU SHALL NOT PASS."; hijack.SetResponseContent("{\"other\":\"donkey\"}"); try { JToken response = await service.GetTable(collection).ReadAsync(query); } catch (InvalidOperationException ex) { Assert.AreEqual("The request could not be completed. (YOU SHALL NOT PASS.)", ex.Message); } }
public async Task ReadAsyncWithNullIdFilter() { TestHttpHandler hijack = new TestHttpHandler(); hijack.SetResponseContent("[{\"id\":null,\"String\":\"Hey\"}]"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable table = service.GetTable("someTable"); JToken results = await table.ReadAsync("$filter=id eq null"); JToken[] items = results.ToArray(); JObject item0 = items[0] as JObject; Uri expectedUri = new Uri(mobileAppUriValidator.GetTableUri("someTable?$filter=id eq null")); Assert.AreEqual(1, items.Count()); Assert.AreEqual(null, (string)items[0]["id"]); Assert.AreEqual("Hey", (string)items[0]["String"]); Assert.AreEqual(hijack.Request.RequestUri.AbsoluteUri, expectedUri.AbsoluteUri); }
public async Task LookupAsyncWithStringIdTypeAndStringIdParameter() { string[] testIdData = IdTestData.ValidStringIds.ToArray(); foreach (string testId in testIdData) { TestHttpHandler hijack = new TestHttpHandler(); hijack.SetResponseContent("{\"id\":\"" + testId + "\",\"String\":\"Hey\"}"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable<StringIdType> table = service.GetTable<StringIdType>(); StringIdType item = await table.LookupAsync(testId); Uri expectedUri = new Uri(string.Format(mobileAppUriValidator.GetTableUri("StringIdType/{0}"), Uri.EscapeDataString(testId))); Assert.AreEqual(testId, item.Id); Assert.AreEqual("Hey", item.String); Assert.AreEqual(hijack.Request.RequestUri.AbsoluteUri, expectedUri.AbsoluteUri); } }
public async Task UpdateAsyncWithStringIdTypeAndStringIdItem() { string[] testIdData = IdTestData.ValidStringIds.ToArray(); foreach (string testId in testIdData) { TestHttpHandler hijack = new TestHttpHandler(); hijack.SetResponseContent("{\"id\":\"" + testId + "\",\"String\":\"Hey\"}"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable<StringIdType> table = service.GetTable<StringIdType>(); hijack.OnSendingRequest = async request => { string requestContent = await request.Content.ReadAsStringAsync(); JObject itemAsJObject = JObject.Parse(requestContent); Assert.AreEqual(testId, (string)itemAsJObject["id"]); Assert.AreEqual("what?", (string)itemAsJObject["String"]); string idForUri = Uri.EscapeDataString(testId); Uri expectedUri = new Uri(string.Format(mobileAppUriValidator.GetTableUri("StringIdType/{0}"), idForUri)); Assert.AreEqual(request.RequestUri.AbsoluteUri, expectedUri.AbsoluteUri); return request; }; StringIdType item = new StringIdType() { Id = testId, String = "what?" }; await table.UpdateAsync(item); Assert.AreEqual(testId, item.Id); Assert.AreEqual("Hey", item.String); } }
public async Task RefreshAsyncWithStringIdTypeAndStringIdItem() { string[] testIdData = IdTestData.ValidStringIds.ToArray(); foreach (string testId in testIdData) { TestHttpHandler hijack = new TestHttpHandler(); hijack.SetResponseContent("[{\"id\":\"" + testId + "\",\"String\":\"Hey\"}]"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable<StringIdType> table = service.GetTable<StringIdType>(); StringIdType item = new StringIdType() { Id = testId, String = "what?" }; await table.RefreshAsync(item); string idForOdataQuery = Uri.EscapeDataString(testId.Replace("'", "''")); Uri expectedUri = new Uri(string.Format(mobileAppUriValidator.GetTableUri("StringIdType?$filter=(id eq '{0}')"), idForOdataQuery)); Assert.AreEqual(testId, item.Id); Assert.AreEqual("Hey", item.String); Assert.AreEqual(hijack.Request.RequestUri.AbsoluteUri, expectedUri.AbsoluteUri); } }
public async Task RefreshAsyncWithIntIdTypeAndIntIdItem() { long[] testIdData = IdTestData.ValidIntIds; foreach (long testId in testIdData) { TestHttpHandler hijack = new TestHttpHandler(); hijack.SetResponseContent("[{\"id\":" + testId + ",\"String\":\"Hey\"}]"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable<LongIdType> table = service.GetTable<LongIdType>(); LongIdType item = new LongIdType() { Id = testId, String = "what?" }; await table.RefreshAsync(item); Uri expectedUri = new Uri(string.Format(mobileAppUriValidator.GetTableUri("LongIdType?$filter=(id eq {0}L)"), testId)); Assert.AreEqual(testId, item.Id); Assert.AreEqual("Hey", item.String); Assert.AreEqual(hijack.Request.RequestUri.AbsoluteUri, expectedUri.AbsoluteUri); } }
public async Task PurgeAsync_ResetsDeltaToken_WhenQueryIdIsSpecified() { var hijack = new TestHttpHandler(); hijack.AddResponseContent(@"[{""id"":""abc"",""String"":""Hey"", ""updatedAt"": ""2001-02-03T00:00:00.0000000+00:00""}, {""id"":""def"",""String"":""How"", ""updatedAt"": ""2001-02-04T00:00:00.0000000+00:00""}]"); // first page hijack.AddResponseContent("[]"); // last page of first pull hijack.AddResponseContent("[]"); // second pull var store = new MobileServiceLocalStoreMock(); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler()); IMobileServiceSyncTable<ToDoWithStringId> table = service.GetSyncTable<ToDoWithStringId>(); // ensure there is no delta token present already Assert.IsFalse(store.TableMap.ContainsKey("stringId_test_table")); // now pull down data await table.PullAsync("items", table.CreateQuery()); // ensure items were pulled down Assert.AreEqual(store.TableMap["stringId_test_table"].Count, 2); Assert.AreEqual(store.TableMap["stringId_test_table"]["abc"].Value<string>("String"), "Hey"); Assert.AreEqual(store.TableMap["stringId_test_table"]["def"].Value<string>("String"), "How"); // ensure delta token was updated Assert.Equals(store.TableMap[MobileServiceLocalSystemTables.Config]["deltaToken|stringId_test_table|items"]["value"], "2001-02-04T00:00:00.0000000+00:00"); // now purge and forget the delta token await table.PurgeAsync("items", null, false, CancellationToken.None); // make sure data is purged Assert.AreEqual(store.TableMap["stringId_test_table"].Count, 0); // make sure delta token is removed Assert.IsFalse(store.TableMap[MobileServiceLocalSystemTables.Config].ContainsKey("deltaToken|stringId_test_table|items")); // pull again await table.PullAsync("items", table.CreateQuery()); // verify request urls AssertEx.MatchUris(hijack.Requests, mobileAppUriValidator.GetTableUri("stringId_test_table?$filter=(updatedAt ge datetimeoffset'1970-01-01T00:00:00.0000000%2B00:00')&$orderby=updatedAt&$skip=0&$top=50&__includeDeleted=true"), mobileAppUriValidator.GetTableUri("stringId_test_table?$filter=(updatedAt ge datetimeoffset'2001-02-04T00:00:00.0000000%2B00:00')&$orderby=updatedAt&$skip=0&$top=50&__includeDeleted=true"), mobileAppUriValidator.GetTableUri("stringId_test_table?$filter=(updatedAt ge datetimeoffset'1970-01-01T00:00:00.0000000%2B00:00')&$orderby=updatedAt&$skip=0&$top=50&__includeDeleted=true")); }
private static async Task TestIncrementalPull(MobileServiceLocalStoreMock store, MobileServiceRemoteTableOptions options, params string[] expectedTableUriComponents) { var hijack = new TestHttpHandler(); hijack.AddResponseContent(@"[{""id"":""abc"",""String"":""Hey"", ""updatedAt"": ""2001-02-03T00:00:00.0000000+00:00""}, {""id"":""def"",""String"":""World"", ""updatedAt"": ""2001-02-03T00:03:00.0000000+07:00""}]"); // for pull hijack.AddResponseContent(@"[]"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler()); IMobileServiceSyncTable<ToDoWithStringId> table = service.GetSyncTable<ToDoWithStringId>(); table.SupportedOptions = options; var query = table.Where(t => t.String == "world") .WithParameters(new Dictionary<string, string>() { { "param1", "val1" } }) .IncludeTotalCount(); await table.PullAsync("incquery", query, cancellationToken: CancellationToken.None); var expectedTableUris = expectedTableUriComponents.Select( expectedTableUriComponent => mobileAppUriValidator.GetTableUri(expectedTableUriComponent)).ToArray(); AssertEx.MatchUris(hijack.Requests, expectedTableUris); }
public async Task PullAsync_Incremental_MovesByUpdatedAt_ThenUsesSkipAndTop_WhenUpdatedAtDoesNotChange() { var hijack = new TestHttpHandler(); hijack.OnSendingRequest = req => { return Task.FromResult(req); }; hijack.AddResponseContent(@"[{""id"":""abc"",""String"":""Hey"", ""updatedAt"": ""2001-02-03T00:00:00.0000000+00:00""}]"); hijack.AddResponseContent(@"[{""id"":""def"",""String"":""World"", ""updatedAt"": ""2001-02-03T00:00:00.0000000+00:00""}]"); hijack.AddResponseContent("[]"); // last page var store = new MobileServiceLocalStoreMock(); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler()); IMobileServiceSyncTable<ToDoWithStringId> table = service.GetSyncTable<ToDoWithStringId>(); await table.PullAsync("items", table.CreateQuery()); AssertEx.MatchUris(hijack.Requests, mobileAppUriValidator.GetTableUri("stringId_test_table?$filter=(updatedAt ge datetimeoffset'1970-01-01T00:00:00.0000000%2B00:00')&$orderby=updatedAt&$skip=0&$top=50&__includeDeleted=true"), mobileAppUriValidator.GetTableUri("stringId_test_table?$filter=(updatedAt ge datetimeoffset'2001-02-03T00:00:00.0000000%2B00:00')&$orderby=updatedAt&$skip=0&$top=50&__includeDeleted=true"), mobileAppUriValidator.GetTableUri("stringId_test_table?$filter=(updatedAt ge datetimeoffset'2001-02-03T00:00:00.0000000%2B00:00')&$orderby=updatedAt&$skip=1&$top=50&__includeDeleted=true")); }
public async Task ReadAsyncWithIntIdTypeAndOrderByDescending() { long[] testIdData = IdTestData.ValidIntIds.Concat( IdTestData.InvalidIntIds).ToArray(); foreach (long testId in testIdData) { TestHttpHandler hijack = new TestHttpHandler(); hijack.SetResponseContent("[{\"id\":\"" + testId + "\",\"String\":\"Hey\"}]"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable<LongIdType> table = service.GetTable<LongIdType>(); var items = await table.OrderByDescending(s => s.Id).ToListAsync(); Uri expectedUri = new Uri(mobileAppUriValidator.GetTableUri("LongIdType?$orderby=id desc")); Assert.AreEqual(1, items.Count()); Assert.AreEqual(testId, items[0].Id); Assert.AreEqual("Hey", items[0].String); Assert.AreEqual(hijack.Request.RequestUri.AbsoluteUri, expectedUri.AbsoluteUri); } }
public async Task DeleteAsyncWithStringIdTypeAndStringIdItem() { string[] testIdData = IdTestData.ValidStringIds; foreach (string testId in testIdData) { TestHttpHandler hijack = new TestHttpHandler(); hijack.SetResponseContent("{\"id\":\"" + testId + "\",\"String\":\"Hey\"}"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable<StringIdType> table = service.GetTable<StringIdType>(); hijack.OnSendingRequest = request => { Assert.IsNull(request.Content); string idForUri = Uri.EscapeDataString(testId); Uri expectedUri = new Uri(string.Format(mobileAppUriValidator.GetTableUri("StringIdType/{0}"), idForUri)); Assert.AreEqual(request.RequestUri.AbsoluteUri, expectedUri.AbsoluteUri); return new TaskFactory<HttpRequestMessage>().StartNew(() => request); }; StringIdType item = new StringIdType() { Id = testId, String = "what?" }; await table.DeleteAsync(item); Assert.AreEqual(null, item.Id); Assert.AreEqual("what?", item.String); } }
public async Task LookupAsyncWithStringIdTypeAndStringIdResponseContent() { string[] testIdData = IdTestData.ValidStringIds.Concat( IdTestData.EmptyStringIds).Concat( IdTestData.InvalidStringIds).ToArray(); foreach (string testId in testIdData) { TestHttpHandler hijack = new TestHttpHandler(); // Make the testId JSON safe string jsonTestId = testId.Replace("\\", "\\\\").Replace("\"", "\\\""); hijack.SetResponseContent("{\"id\":\"" + jsonTestId + "\",\"String\":\"Hey\"}"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable<StringIdType> table = service.GetTable<StringIdType>(); StringIdType item = await table.LookupAsync("an id"); Assert.AreEqual(testId, item.Id); Assert.AreEqual("Hey", item.String); } }
public async Task ReadAsyncWithStringIdTypeAndStringIdFilter() { string[] testIdData = IdTestData.ValidStringIds.Concat( IdTestData.EmptyStringIds).Concat( IdTestData.InvalidStringIds).ToArray(); foreach (string testId in testIdData) { TestHttpHandler hijack = new TestHttpHandler(); // Make the testId JSON safe string jsonTestId = testId.Replace("\\", "\\\\").Replace("\"", "\\\""); hijack.SetResponseContent("[{\"id\":\"" + jsonTestId + "\",\"String\":\"Hey\"}]"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable<StringIdType> table = service.GetTable<StringIdType>(); List<StringIdType> items = await table.Where(t => t.Id == testId).ToListAsync(); string idForOdataQuery = Uri.EscapeDataString(testId.Replace("'", "''")); Uri expectedUri = new Uri(string.Format(mobileAppUriValidator.GetTableUri("StringIdType?$filter=(id eq '{0}')"), idForOdataQuery)); Assert.AreEqual(1, items.Count()); Assert.AreEqual(testId, items[0].Id); Assert.AreEqual(hijack.Request.RequestUri.AbsoluteUri, expectedUri.AbsoluteUri); } }
public async Task ReadAsyncWithStringIdFilter() { string[] testIdData = IdTestData.ValidStringIds.Concat( IdTestData.EmptyStringIds).Concat( IdTestData.InvalidStringIds).ToArray(); foreach (string testId in testIdData) { TestHttpHandler hijack = new TestHttpHandler(); // Make the testId JSON safe string jsonTestId = testId.Replace("\\", "\\\\").Replace("\"", "\\\""); hijack.SetResponseContent("[{\"id\":\"" + jsonTestId + "\",\"String\":\"Hey\"}]"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable table = service.GetTable("someTable"); string idForOdataQuery = Uri.EscapeDataString(testId.Replace("'", "''")); JToken results = await table.ReadAsync(string.Format("$filter=id eq '{0}'", idForOdataQuery)); JToken[] items = results.ToArray(); JObject item0 = items[0] as JObject; Uri expectedUri = new Uri(string.Format(mobileAppUriValidator.GetTableUri("someTable?$filter=id eq '{0}'"), idForOdataQuery)); Assert.AreEqual(1, items.Count()); Assert.AreEqual(testId, (string)items[0]["id"]); Assert.AreEqual("Hey", (string)items[0]["String"]); Assert.AreEqual(hijack.Request.RequestUri.AbsoluteUri, expectedUri.AbsoluteUri); } }
public async Task ReadAsyncWithStringIdTypeAndStringIdProjection() { string[] testIdData = IdTestData.ValidStringIds.Concat( IdTestData.EmptyStringIds).Concat( IdTestData.InvalidStringIds).ToArray(); foreach (string testId in testIdData) { TestHttpHandler hijack = new TestHttpHandler(); // Make the testId JSON safe string jsonTestId = testId.Replace("\\", "\\\\").Replace("\"", "\\\""); hijack.SetResponseContent("[{\"id\":\"" + jsonTestId + "\",\"String\":\"Hey\"}]"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable<StringIdType> table = service.GetTable<StringIdType>(); var items = await table.Select(s => new { Id = s.Id, Message = s.String }).ToListAsync(); Uri expectedUri = new Uri(mobileAppUriValidator.GetTableUri("StringIdType?$select=id,String")); Assert.AreEqual(1, items.Count()); Assert.AreEqual(testId, items[0].Id); Assert.AreEqual("Hey", items[0].Message); Assert.AreEqual(hijack.Request.RequestUri.AbsoluteUri, expectedUri.AbsoluteUri); } }
public async Task LookupAsyncWithIntIdParameter() { long[] testIdData = IdTestData.ValidIntIds; foreach (long testId in testIdData) { TestHttpHandler hijack = new TestHttpHandler(); hijack.SetResponseContent("{\"id\":" + testId.ToString() + ",\"String\":\"Hey\"}"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable table = service.GetTable("someTable"); JToken item = await table.LookupAsync(testId); Uri expectedUri = new Uri(string.Format(mobileAppUriValidator.GetTableUri("someTable/{0}"), testId)); Assert.AreEqual(testId, (long)item["id"]); Assert.AreEqual("Hey", (string)item["String"]); Assert.AreEqual(hijack.Request.RequestUri.AbsoluteUri, expectedUri.AbsoluteUri); } }
public async Task ReadAsyncWithIntIdTypeAndIntIdResponseContent() { long[] testIdData = IdTestData.ValidIntIds.Concat( IdTestData.InvalidIntIds).ToArray(); foreach (long testId in testIdData) { TestHttpHandler hijack = new TestHttpHandler(); hijack.SetResponseContent("[{\"id\":" + testId + ",\"String\":\"Hey\"}]"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable<LongIdType> table = service.GetTable<LongIdType>(); IEnumerable<LongIdType> results = await table.ReadAsync(); LongIdType[] items = results.ToArray(); Assert.AreEqual(1, items.Count()); Assert.AreEqual(testId, items[0].Id); Assert.AreEqual("Hey", items[0].String); } }
public async Task InvokeCustomAPISimple() { TestHttpHandler hijack = new TestHttpHandler(); MobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); hijack.SetResponseContent("{\"id\":3}"); IntType expected = await service.InvokeApiAsync<IntType>("calculator/add?a=1&b=2"); Assert.AreEqual(hijack.Request.RequestUri.LocalPath, mobileAppUriValidator.GetApiUriPath("calculator/add")); Assert.AreEqual(hijack.Request.RequestUri.Query, "?a=1&b=2"); Assert.AreEqual(3, expected.Id); }
public async Task ReadAsyncWithIntIdTypeAndIntIdFilter() { long[] testIdData = IdTestData.ValidIntIds.Concat( IdTestData.InvalidIntIds).ToArray(); foreach (long testId in testIdData) { TestHttpHandler hijack = new TestHttpHandler(); hijack.SetResponseContent("[{\"id\":" + testId + ",\"String\":\"Hey\"}]"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable<LongIdType> table = service.GetTable<LongIdType>(); List<LongIdType> items = await table.Where(t => t.Id == testId).ToListAsync(); Uri expectedUri = new Uri(string.Format(mobileAppUriValidator.GetTableUri("LongIdType?$filter=(id eq {0}L)"), testId)); Assert.AreEqual(1, items.Count()); Assert.AreEqual(testId, items[0].Id); Assert.AreEqual(hijack.Request.RequestUri.AbsoluteUri, expectedUri.AbsoluteUri); } }
public async Task InvokeCustomAPIResponseWithParams() { TestHttpHandler hijack = new TestHttpHandler(); hijack.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Accepted); hijack.Response.Content = new StringContent("{\"id\":\"2\"}", Encoding.UTF8, "application/json"); var myParams = new Dictionary<string, string>() { { "a", "1" }, { "b", "2" } }; MobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); HttpResponseMessage response = await service.InvokeApiAsync("calculator/add", null, HttpMethod.Post, null, myParams); Assert.AreEqual(hijack.Request.RequestUri.LocalPath, mobileAppUriValidator.GetApiUriPath("calculator/add")); Assert.AreEqual(hijack.Request.RequestUri.Query, "?a=1&b=2"); Assert.IsNull(hijack.Request.Content); Assert.Contains(response.Content.ReadAsStringAsync().Result, "{\"id\":\"2\"}"); }
public async Task ReadAsyncWithIntIdTypeAndNullIdFilter() { TestHttpHandler hijack = new TestHttpHandler(); hijack.SetResponseContent("[{\"id\":null,\"String\":\"Hey\"}]"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable<LongIdType> table = service.GetTable<LongIdType>(); List<LongIdType> items = await table.Where(t => t.Id == null).ToListAsync(); Uri expectedUri = new Uri(mobileAppUriValidator.GetTableUri("LongIdType?$filter=(id eq null)")); Assert.AreEqual(1, items.Count()); Assert.AreEqual(0L, items[0].Id); Assert.AreEqual(hijack.Request.RequestUri.AbsoluteUri, expectedUri.AbsoluteUri); }
public async Task InvokeCustomAPIResponseWithParamsBodyAndHeader() { TestHttpHandler hijack = new TestHttpHandler(); hijack.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Accepted); hijack.Response.Content = new StringContent("{\"id\":\"2\"}", Encoding.UTF8, "application/json"); var myParams = new Dictionary<string, string>() { { "a", "1" }, { "b", "2" } }; HttpContent content = new StringContent("{\"test\" : \"one\"}", Encoding.UTF8, "application/json"); MobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); var myHeaders = new Dictionary<string, string>() { { "x-zumo-test", "test" } }; HttpResponseMessage response = await service.InvokeApiAsync("calculator/add", content, HttpMethod.Post, myHeaders, myParams); Assert.AreEqual(myHeaders.Count, 1); // my headers should not be modified Assert.AreEqual(myHeaders["x-zumo-test"], "test"); Assert.AreEqual(hijack.Request.RequestUri.LocalPath, mobileAppUriValidator.GetApiUriPath("calculator/add")); Assert.AreEqual(hijack.Request.Headers.GetValues("x-zumo-test").First(), "test"); Assert.IsNotNull(hijack.Request.Content); Assert.AreEqual(hijack.Request.RequestUri.Query, "?a=1&b=2"); Assert.Contains(response.Content.ReadAsStringAsync().Result, "{\"id\":\"2\"}"); }
public async Task ReadAsyncWithIntIdTypeAndNoIdProjection() { TestHttpHandler hijack = new TestHttpHandler(); hijack.SetResponseContent("[{\"String\":\"Hey\"}]"); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IMobileServiceTable<LongIdType> table = service.GetTable<LongIdType>(); var items = await table.Select(s => new { Id = s.Id, Message = s.String }).ToListAsync(); Uri expectedUri = new Uri(mobileAppUriValidator.GetTableUri("LongIdType?$select=id,String")); Assert.AreEqual(1, items.Count()); Assert.AreEqual(0L, items[0].Id); Assert.AreEqual("Hey", items[0].Message); Assert.AreEqual(hijack.Request.RequestUri.AbsoluteUri, expectedUri.AbsoluteUri); }
public async Task InvokeGenericCustomAPIWithNullResponse_Success() { TestHttpHandler hijack = new TestHttpHandler(); hijack.Response = new HttpResponseMessage(System.Net.HttpStatusCode.OK); hijack.Response.Content = null; MobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); IntType expected = await service.InvokeApiAsync<IntType>("testapi"); Assert.AreEqual(hijack.Request.RequestUri.LocalPath, mobileAppUriValidator.GetApiUriPath("testapi")); Assert.AreEqual(expected, null); }
public async Task PullAsync_DoesNotFollowLink_IfLinkHasNonSupportedOptions() { var hijack = new TestHttpHandler(); hijack.AddResponseContent("[{\"id\":\"abc\",\"String\":\"Hey\"},{\"id\":\"def\",\"String\":\"How\"}]"); // first page hijack.Responses[0].Headers.Add("Link", "http://contoso.com:31475/tables/Green?$top=1&$select=Text%2CDone%2CId&$skip=2; rel=next"); hijack.AddResponseContent("[{\"id\":\"ghi\",\"String\":\"Are\"},{\"id\":\"jkl\",\"String\":\"You\"}]"); // second page hijack.AddResponseContent("[]"); // end of the list var store = new MobileServiceLocalStoreMock(); IMobileServiceClient service = new MobileServiceClient(MobileAppUriValidator.DummyMobileApp, hijack); MobileAppUriValidator mobileAppUriValidator = new MobileAppUriValidator(service); await service.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler()); IMobileServiceSyncTable<ToDoWithStringId> table = service.GetSyncTable<ToDoWithStringId>(); table.SupportedOptions &= ~MobileServiceRemoteTableOptions.Skip; Assert.IsFalse(store.TableMap.ContainsKey("stringId_test_table")); await table.PullAsync(null, null); Assert.AreEqual(store.TableMap["stringId_test_table"].Count, 2); AssertEx.MatchUris(hijack.Requests, mobileAppUriValidator.GetTableUri("stringId_test_table?$top=50&__includeDeleted=true")); }