public async Task GetDeviceAsyncTest()
		{
			Int32 _Id = 0;
			String _Name = String.Empty;
			String _Description = String.Empty;
			Int32 _DisplayOrder = 0;
			DateTimeOffset _DateCreated = DateTimeOffset.MinValue;
			Boolean _IsReadOnly = false;
			// Setup Stub
			var stub = new StubIDevice();
			stub.Id_Get(() => _Id);
			stub.Id_Set((v) => _Id = v);
			stub.Name_Get(() => _Name);
			stub.Name_Set((v) => _Name = v);
			stub.Description_Get(() => _Description);
			stub.Description_Set((v) => _Description = v);
			stub.DisplayOrder_Get(() => _DisplayOrder);
			stub.DisplayOrder_Set((v) => _DisplayOrder = v);
			stub.DateCreated_Get(() => _DateCreated);
			stub.DateCreated_Set((v) => _DateCreated = v);
			stub.IsReadOnly_Get(() => _IsReadOnly);
			stub.IsReadOnly_Set((v) => _IsReadOnly = v);
			// create helper
			var create = new StubICreateHelper();
			create.CreateDevice(() => stub);
			// settings 
			var settings = new StubIServerSettings();
			settings.ServerUri_Get(() => null);
			// Http Client
			var httpClient = new StubIHttpClient();
			// Server 
			var serverContext = new ServerContext(settings, create, httpClient);
			Int32 key = 179;
			// leading
			var results = await serverContext.GetDeviceAsync(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.GetDeviceAsync(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 = 137;
			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/Device/{key}"), uri);
					expectedException = new COMException("Message1", -2147012867);
					throw expectedException;
					return new HttpClientResult();
				}

				).AsAsyncOperation();
			}

			);
			results = await serverContext.GetDeviceAsync(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.GetDeviceAsync(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.GetDeviceAsync(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.GetDeviceAsync(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 StubIDevice();
			exp.Id_Get(() => key);
			exp.Name_Get(() => "gntloguqyqftfqllcsrkqtoyosk");
			exp.Description_Get(() => "oexoalbgrnxhwvgkvhvchtgve");
			exp.DisplayOrder_Get(() => 56);
			exp.DateCreated_Get(() => new DateTimeOffset(1987, 6, 26, 20, 53, 50, TimeSpan.FromHours(-5)));
			exp.IsReadOnly_Get(() => false);
			IDevice expected = exp;
			var jobj = new JObject();
			jobj.Add(new JProperty(nameof(expected.Id), expected.Id));
			jobj.Add(new JProperty(nameof(expected.Name), expected.Name));
			jobj.Add(new JProperty(nameof(expected.Description), expected.Description));
			jobj.Add(new JProperty(nameof(expected.DisplayOrder), expected.DisplayOrder));
			jobj.Add(new JProperty(nameof(expected.DateCreated), expected.DateCreated));
			jobj.Add(new JProperty(nameof(expected.IsReadOnly), expected.IsReadOnly));
			methodHit = false;
			httpClient.GetAsync((uri) =>
			{
				return Task.Run(() =>
				{
					methodHit = true;
					return new HttpClientResult{StatusCode = HttpStatusCode.Ok, Content = jobj.ToString()};
				}

				).AsAsyncOperation();
			}

			);
			results = await serverContext.GetDeviceAsync(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.Name, actual.Name);
			Assert.AreEqual(expected.Description, actual.Description);
			Assert.AreEqual(expected.DisplayOrder, actual.DisplayOrder);
			Assert.AreEqual(expected.DateCreated, actual.DateCreated);
			Assert.AreEqual(expected.IsReadOnly, actual.IsReadOnly);
		}