public async Task GetTemperatureSettingAsyncTest() { Int64 _Id = 0; Int32? _DayOfWeek = 0; Int32? _Month = 0; Boolean _IsTimeOnly = false; DateTimeOffset? _StartTime = DateTimeOffset.MinValue; DateTimeOffset? _EndTime = DateTimeOffset.MinValue; Double _HeatTemperatureC = 0; Double _CoolTemperatureC = 0; DateTimeOffset _DateCreated = DateTimeOffset.MinValue; DateTimeOffset _DateModified = DateTimeOffset.MinValue; // Setup Stub var stub = new StubITemperatureSetting(); stub.Id_Get(() => _Id); stub.Id_Set((v) => _Id = v); stub.DayOfWeek_Get(() => _DayOfWeek); stub.DayOfWeek_Set((v) => _DayOfWeek = v); stub.Month_Get(() => _Month); stub.Month_Set((v) => _Month = v); stub.IsTimeOnly_Get(() => _IsTimeOnly); stub.IsTimeOnly_Set((v) => _IsTimeOnly = v); stub.StartTime_Get(() => _StartTime); stub.StartTime_Set((v) => _StartTime = v); stub.EndTime_Get(() => _EndTime); stub.EndTime_Set((v) => _EndTime = v); stub.HeatTemperatureC_Get(() => _HeatTemperatureC); stub.HeatTemperatureC_Set((v) => _HeatTemperatureC = v); stub.CoolTemperatureC_Get(() => _CoolTemperatureC); stub.CoolTemperatureC_Set((v) => _CoolTemperatureC = v); stub.DateCreated_Get(() => _DateCreated); stub.DateCreated_Set((v) => _DateCreated = v); stub.DateModified_Get(() => _DateModified); stub.DateModified_Set((v) => _DateModified = v); // create helper var create = new StubICreateHelper(); create.CreateTemperatureSetting(() => stub); // settings var settings = new StubIServerSettings(); settings.ServerUri_Get(() => null); // Http Client var httpClient = new StubIHttpClient(); // Server var serverContext = new ServerContext(settings, create, httpClient); Int64 key = 51; // leading var results = await serverContext.GetTemperatureSettingAsync(key); Assert.AreEqual(RequestStatus.ServerUriNotSet, results.Status); Assert.IsNull(results.Data, "Data should not be null"); Assert.AreEqual(0, results.Key); // login exception settings.ServerUri_Get(() => new Uri("http://test")); httpClient.PostAsync((uri, d) => { return Task.Run(() => { return new HttpClientResult{StatusCode = HttpStatusCode.Ok, Content = ""}; } ).AsAsyncOperation(); } ); httpClient.GetCookieValue((u, name) => "Value"); await serverContext.LoginAsync("user", "pass"); settings.ServerUri_Get(() => new Uri("/cheese", UriKind.Relative)); // invalid uri results = await serverContext.GetTemperatureSettingAsync(key); Assert.AreEqual(RequestStatus.ServerUriIsNotValid, results.Status); Assert.IsNull(results.Data, "Data should not be null"); Assert.AreEqual(0, results.Key); // Unable to connect to server key = 76; settings.ServerUri_Get(() => new Uri("http://test")); Exception expectedException = null; bool methodHit = false; httpClient.GetAsync((uri) => { return Task.Run(() => { methodHit = true; Assert.AreEqual(new Uri($"http://test/api/TemperatureSetting/{key}"), uri); expectedException = new COMException("Message1", -2147012867); throw expectedException; return new HttpClientResult(); } ).AsAsyncOperation(); } ); results = await serverContext.GetTemperatureSettingAsync(key); Assert.IsTrue(methodHit, "Method not called"); Assert.AreEqual(RequestStatus.UnableToConnectToServer, results.Status); Assert.IsNull(results.Data, "Data should not be null"); Assert.AreEqual(key, results.Key); Assert.AreEqual(expectedException, results.Exception); // COMException methodHit = false; httpClient.GetAsync((uri) => { return Task.Run(() => { methodHit = true; expectedException = new COMException("Message2"); throw expectedException; return new HttpClientResult(); } ).AsAsyncOperation(); } ); results = await serverContext.GetTemperatureSettingAsync(key); Assert.IsTrue(methodHit, "Method not called"); Assert.AreEqual(RequestStatus.Exception, results.Status); Assert.IsNull(results.Data, "Data should be null"); Assert.AreEqual(key, results.Key); Assert.AreEqual(expectedException, results.Exception); // Exception methodHit = false; httpClient.GetAsync((uri) => { return Task.Run(() => { methodHit = true; expectedException = new Exception("Message3"); throw expectedException; return new HttpClientResult(); } ).AsAsyncOperation(); } ); results = await serverContext.GetTemperatureSettingAsync(key); Assert.IsTrue(methodHit, "Method not called"); Assert.AreEqual(RequestStatus.Exception, results.Status); Assert.IsNull(results.Data, "Data should be null"); Assert.AreEqual(key, results.Key); Assert.AreEqual(expectedException, results.Exception); // Unauthorized methodHit = false; httpClient.GetAsync((uri) => { return Task.Run(() => { methodHit = true; return new HttpClientResult() {StatusCode = HttpStatusCode.Unauthorized, Content = "{Test: 'cheese'"}; } ).AsAsyncOperation(); } ); results = await serverContext.GetTemperatureSettingAsync(key); Assert.IsTrue(methodHit, "Method not called"); Assert.AreEqual(RequestStatus.Error, results.Status); Assert.IsNull(results.Data, "Data should be null"); Assert.AreEqual(key, results.Key); Assert.IsInstanceOfType(results.Exception, typeof (JsonReaderException)); // Success Test var exp = new StubITemperatureSetting(); exp.Id_Get(() => key); exp.DayOfWeek_Get(() => 9); exp.Month_Get(() => 131); exp.IsTimeOnly_Get(() => true); exp.StartTime_Get(() => new DateTimeOffset(2007, 8, 16, 6, 43, 26, TimeSpan.FromHours(-6))); exp.EndTime_Get(() => new DateTimeOffset(2003, 7, 27, 5, 23, 23, TimeSpan.FromHours(-5))); exp.HeatTemperatureC_Get(() => 0.29844863586986842); exp.CoolTemperatureC_Get(() => 0.8659522150950284); exp.DateCreated_Get(() => new DateTimeOffset(2002, 2, 7, 8, 52, 43, TimeSpan.FromHours(-6))); exp.DateModified_Get(() => new DateTimeOffset(1985, 4, 19, 19, 36, 22, TimeSpan.FromHours(-7))); ITemperatureSetting expected = exp; var jobj = new JObject(); jobj.Add(new JProperty(nameof(expected.Id), expected.Id)); jobj.Add(new JProperty(nameof(expected.DayOfWeek), expected.DayOfWeek)); jobj.Add(new JProperty(nameof(expected.Month), expected.Month)); jobj.Add(new JProperty(nameof(expected.IsTimeOnly), expected.IsTimeOnly)); jobj.Add(new JProperty(nameof(expected.StartTime), expected.StartTime)); jobj.Add(new JProperty(nameof(expected.EndTime), expected.EndTime)); jobj.Add(new JProperty(nameof(expected.HeatTemperatureC), expected.HeatTemperatureC)); jobj.Add(new JProperty(nameof(expected.CoolTemperatureC), expected.CoolTemperatureC)); jobj.Add(new JProperty(nameof(expected.DateCreated), expected.DateCreated)); jobj.Add(new JProperty(nameof(expected.DateModified), expected.DateModified)); methodHit = false; httpClient.GetAsync((uri) => { return Task.Run(() => { methodHit = true; return new HttpClientResult{StatusCode = HttpStatusCode.Ok, Content = jobj.ToString()}; } ).AsAsyncOperation(); } ); results = await serverContext.GetTemperatureSettingAsync(key); Assert.IsTrue(methodHit, "Method not called"); Assert.AreEqual(RequestStatus.Success, results.Status); Assert.AreEqual(key, results.Key); Assert.IsNull(results.Exception, "Exception should be null"); Assert.IsNotNull(results.Data, "Data should not be null"); var actual = results.Data; Assert.AreEqual(expected.Id, actual.Id); Assert.AreEqual(expected.DayOfWeek, actual.DayOfWeek); Assert.AreEqual(expected.Month, actual.Month); Assert.AreEqual(expected.IsTimeOnly, actual.IsTimeOnly); Assert.AreEqual(expected.StartTime, actual.StartTime); Assert.AreEqual(expected.EndTime, actual.EndTime); Assert.AreEqual(expected.HeatTemperatureC, actual.HeatTemperatureC); Assert.AreEqual(expected.CoolTemperatureC, actual.CoolTemperatureC); Assert.AreEqual(expected.DateCreated, actual.DateCreated); Assert.AreEqual(expected.DateModified, actual.DateModified); }