public async void HttpClient_Post_Retry_success_with_two_errors() { // setup the responses var errorResponse = new HttpResponseMessage(HttpStatusCode.InternalServerError) { Content = new StringContent("{content}") }; var successResponse = new HttpResponseMessage(HttpStatusCode.Created) { Content = new StringContent("{foo: \"bar\"}") }; //setup mock httpClient var mockHttp = new MockHttpMessageHandler(); mockHttp.Expect(HttpMethod.Post, "http://www.x.badgeup.io/v2/apps/1337/testEndpoint").Respond(r => errorResponse); mockHttp.Expect(HttpMethod.Post, "http://www.x.badgeup.io/v2/apps/1337/testEndpoint").Throw(new TaskCanceledException("Simulated timeout exception")); mockHttp.Expect(HttpMethod.Post, "http://www.x.badgeup.io/v2/apps/1337/testEndpoint").Respond(r => successResponse); //Test var client = new BadgeUpHttpClient(ApiKey.Create(Key), "http://www.x.badgeup.io"); client.SetHttpClient(mockHttp.ToHttpClient()); await client.Post <object>(new EventRequest(new Event("subject", "key")), "testEndpoint"); mockHttp.VerifyNoOutstandingExpectation(); }
public async Task WhenSubjectAndKeyContainRestrictedCharacters_GetIndividualBySubject_UrlEncodesRestrictedCharacters() { // Setup mock expectation for a encoded url call var mockHttpHandler = new MockHttpMessageHandler(); var response = @"{ 'id': 'ca98dfajl3kja9kjh34589734', 'applicationId': 'ci123doiu3', 'key': 'testKey 123', 'subject': 'test:subject=123', 'value': 5 }" .Replace("'", "\""); mockHttpHandler.Expect(HttpMethod.Get, "https://api.useast1.badgeup.io/v2/apps/1337/metrics/test%3Asubject%3D123/testKey%20123").Respond("application/json", response); using (var badgeUpClient = new BadgeUpHttpClient(ApiKey.Create("eyJhY2NvdW50SWQiOiJ0aGViZXN0IiwiYXBwbGljYXRpb25JZCI6IjEzMzciLCJrZXkiOiJpY2VjcmVhbWFuZGNvb2tpZXN5dW0ifQ=="), "https://api.useast1.badgeup.io")) { badgeUpClient.SetHttpClient(mockHttpHandler.ToHttpClient()); // pass subject and key with restricted characters var metricClient = new MetricClient(badgeUpClient); var metric = await metricClient.GetIndividualBySubject("test:subject=123", "testKey 123"); Assert.Equal("test:subject=123", metric.Subject); Assert.Equal("testKey 123", metric.Key); } // expect encoded url to have been called mockHttpHandler.VerifyNoOutstandingExpectation(); }
public async Task WhenSubjectAndKeyContainRestrictedCharacters_GetAllBySubject_UrlEncodesRestrictedCharacters() { // Setup mock expectation for a encoded url call var mockHttpHandler = new MockHttpMessageHandler(); var response = @"{ 'pages': { 'previous': null, 'next': null }, 'data': [ { 'id': 'cja8a0980j3jkajhaaa345810', 'applicationId': 'e7kmr6m0ob', 'key': 'test', 'subject': 'test:subject=123', 'value': 5 }, { 'id': 'cjmx29083hjkaaa325usgaitx', 'applicationId': 'e7kmr6m0ob', 'key': 'test:key', 'subject': 'test:subject=123', 'value': 1 }, { 'id': 'cjmy215tq87hdo1b9hrb2qlsj', 'applicationId': 'e7kmr6m0ob', 'key': 'test:metric', 'subject': 'test:subject=123', 'value': 5 } ] }" .Replace("'", "\""); mockHttpHandler.Expect(HttpMethod.Get, "https://api.useast1.badgeup.io/v2/apps/1337/metrics/test%3Asubject%3D123").Respond("application/json", response); using (var badgeUpClient = new BadgeUpHttpClient(ApiKey.Create("eyJhY2NvdW50SWQiOiJ0aGViZXN0IiwiYXBwbGljYXRpb25JZCI6IjEzMzciLCJrZXkiOiJpY2VjcmVhbWFuZGNvb2tpZXN5dW0ifQ=="), "https://api.useast1.badgeup.io")) { badgeUpClient.SetHttpClient(mockHttpHandler.ToHttpClient()); // pass subject and key with restricted characters var metricClient = new MetricClient(badgeUpClient); var metrics = await metricClient.GetAllBySubject("test:subject=123"); Assert.Equal(3, metrics.Count); Assert.Equal("test:subject=123", metrics[0].Subject); Assert.Equal("test:subject=123", metrics[1].Subject); Assert.Equal("test:subject=123", metrics[2].Subject); Assert.Equal("test", metrics[0].Key); Assert.Equal("test:key", metrics[1].Key); Assert.Equal("test:metric", metrics[2].Key); } // expect encoded url to have been called mockHttpHandler.VerifyNoOutstandingExpectation(); }
public async Task WhenShowIncompleteIsFalse_SendV2Preview_MustNotAppendShowIncompleteQueryParam() { using (var badgeUpClient = new BadgeUpHttpClient(ApiKey.Create("eyJhY2NvdW50SWQiOiJ0aGViZXN0IiwiYXBwbGljYXRpb25JZCI6IjEzMzciLCJrZXkiOiJpY2VjcmVhbWFuZGNvb2tpZXN5dW0ifQ=="), "https://api.useast1.badgeup.io")) { // Setup mock response // When there's a showIncomplete=false query param, throw an exception. var mockHttpHandler = new MockHttpMessageHandler(); mockHttpHandler.When(HttpMethod.Post, "https://api.useast1.badgeup.io/v2/apps/1337/events*") .WithQueryString("showIncomplete", "false") .Throw(new InvalidOperationException("URL shouldn't have the showIncomplete param appended")); mockHttpHandler.Fallback.Respond("application/json", @"{ 'event': { 'id': 'cja92jvpj1gummf5lf3jj5fx3', 'applicationId': '1337', 'subject': 'subject-1', 'key': 'jump', 'timestamp': '2017-11-21T03:37:03.559Z', 'modifier': { '@inc': 1 } }, 'progress': [ { 'achievementId': 'cj1sp5nse02j9zkruwhb3zwik', 'earnedAchievementId': 'cj1ss153y02k1zkrun39g8itq', 'isComplete': true, 'isNew': true, 'percentComplete': 1, 'progressTree': { 'type': 'GROUP', 'groups': [], 'criteria': { 'cj1sp461o02imzkruqkqi8amh': 1 }, 'condition': 'AND' } } ] }" .Replace("'", "\"")); // arrange badgeUpClient.SetHttpClient(mockHttpHandler.ToHttpClient()); var client = new EventClient(badgeUpClient); // act await client.Send(new BadgeUp.Types.Event("subject-1", "jump"), showIncomplete : false); await client.Send(new BadgeUp.Types.Event("subject-1", "jump"), showIncomplete : true); await client.Send(new BadgeUp.Types.Event("subject-1", "jump"), showIncomplete : null); } }
public async Task WhenSetupWithResponseData_GetById_CallsUrlOnceAndReturnsCorrectResult() { Assert.False(string.IsNullOrEmpty(AwardClientTests.ApiKey)); var apiKey = BadgeUp.ApiKey.Create(ApiKey); var responseJson = @"{ 'id': 'cjktcmn5o635wmyd0w4ps', 'applicationId': 'g6jtshln48', 'name': '5 points', 'description': '5 Points Awarded', 'meta': { 'created': '2016-09-17T06:50:11.426Z', 'meta_key': 'meta_value' }, 'data': { 'key': 'value', 'points': 5 } }" .Replace("'", "\""); // setup the response action var url = $"{Host}/v2/apps/{apiKey.ApplicationId}/awards/cjktcmn5o635wmyd0w4ps"; var mockHttp = new MockHttpMessageHandler(); var expectedRequest = mockHttp.Expect(HttpMethod.Get, url).Respond("application/json", responseJson); mockHttp.Fallback.Throw(new InvalidOperationException("No matching mock handler")); using (var badgeUpHttpClient = new BadgeUpHttpClient(apiKey, Host)) { badgeUpHttpClient.SetHttpClient(mockHttp.ToHttpClient()); var client = new AwardClient(badgeUpHttpClient); // act var result = await client.GetById("cjktcmn5o635wmyd0w4ps"); // assert url was called only once mockHttp.VerifyNoOutstandingExpectation(); // assert result was parsed correctly Assert.NotNull(result); Assert.Equal("cjktcmn5o635wmyd0w4ps", result.Id); Assert.Equal("g6jtshln48", result.ApplicationId); Assert.Equal("value", result.Data.Value <string>("key")); Assert.Equal(5, result.Data.Value <int>("points")); Assert.Equal("5 points", result.Name); Assert.Equal("5 Points Awarded", result.Description); Assert.Equal(new DateTime(2016, 09, 17, 06, 50, 11, 426, DateTimeKind.Utc), result.Meta.Created); } }
public async Task WhenSetupWithResponseData_GetById_CallsUrlOnceAndReturnsCorrectResult() { Assert.False(string.IsNullOrEmpty(EarnedAwardClientTests.ApiKey)); var apiKey = BadgeUp.ApiKey.Create(ApiKey); var responseJson = @"{ 'id': 'cjktcmn5o635wmyd0w4ps', 'applicationId': 'g6jtshln48', 'achievementId': 'cjktccaf8rsfdia9ea565npch', 'earnedAchievementId': 'cjktcmn5n635w69dhfjp3', 'awardId': 'cjktceks5dxfy1n8e04bcnl1g', 'subject': 'subject-1', 'state': 'APPROVED', 'meta': { 'created': '2016-09-12T06:51:35.453Z' } }" .Replace("'", "\""); // setup the response action var url = $"{Host}/v2/apps/{apiKey.ApplicationId}/earnedawards/cjktcmn5o635wmyd0w4ps"; var mockHttp = new MockHttpMessageHandler(); var expectedRequest = mockHttp.Expect(HttpMethod.Get, url).Respond("application/json", responseJson); mockHttp.Fallback.Throw(new InvalidOperationException("No matching mock handler")); using (var badgeUpHttpClient = new BadgeUpHttpClient(apiKey, Host)) { badgeUpHttpClient.SetHttpClient(mockHttp.ToHttpClient()); var client = new EarnedAwardClient(badgeUpHttpClient); // act var result = await client.GetById("cjktcmn5o635wmyd0w4ps"); // assert url was called only once mockHttp.VerifyNoOutstandingExpectation(); // assert result was parsed correctly Assert.NotNull(result); Assert.Equal("cjktcmn5o635wmyd0w4ps", result.Id); Assert.Equal("g6jtshln48", result.ApplicationId); Assert.Equal("cjktccaf8rsfdia9ea565npch", result.AchievementId); Assert.Equal("cjktcmn5n635w69dhfjp3", result.EarnedAchievementId); Assert.Equal("cjktceks5dxfy1n8e04bcnl1g", result.AwardId); Assert.Equal("subject-1", result.Subject); Assert.Equal(EarnedAwardState.Approved, result.State); Assert.Equal(new DateTime(2016, 09, 12, 06, 51, 35, 453, DateTimeKind.Utc), result.Meta.Created); } }
/// <summary> /// Instantiate the BadgeUpClient, providing an instance of <see cref="ApiKey"/> /// </summary> /// <param name="apiKey">API key generated from the BadgeUp dashboard</param> /// <param name="host">Optional. BadgeUp instance to use.</param> public BadgeUpClient(ApiKey apiKey, string host) { this.m_apiKey = apiKey; this.m_host = host; this.m_httpClient = new BadgeUpHttpClient(apiKey, host); this.Account = new AccountClient(this.m_httpClient); this.Achievement = new AchievementClient(this.m_httpClient); this.AchievementIcon = new AchievementIconClient(this.m_httpClient); this.Application = new ApplicationClient(this.m_httpClient); this.Award = new AwardClient(this.m_httpClient); this.Criterion = new CriterionClient(this.m_httpClient); this.EarnedAchievement = new EarnedAchievementClient(this.m_httpClient); this.EarnedAward = new EarnedAwardClient(this.m_httpClient); this.Event = new EventClient(this.m_httpClient); this.Metric = new MetricClient(this.m_httpClient); this.Progress = new ProgressClient(this.m_httpClient); }
public async void HttpClient_Get_Retry_fails_after_three_errors() { // setup the responses var errorResponse = new HttpResponseMessage(HttpStatusCode.InternalServerError) { Content = new StringContent("{content}") }; //setup mock httpClient var mockHttp = new MockHttpMessageHandler(); mockHttp.Expect(HttpMethod.Get, "http://www.x.badgeup.io/v2/apps/1337/").Respond(r => errorResponse); mockHttp.Expect(HttpMethod.Get, "http://www.x.badgeup.io/v2/apps/1337/").Throw(new TaskCanceledException("Simulated timeout exception")); mockHttp.Expect(HttpMethod.Get, "http://www.x.badgeup.io/v2/apps/1337/").Respond(r => errorResponse); //Test var client = new BadgeUpHttpClient(ApiKey.Create(Key), "http://www.x.badgeup.io"); client.SetHttpClient(mockHttp.ToHttpClient()); await Assert.ThrowsAsync <BadgeUpClientException>(async() => await client.Get <object>("")); mockHttp.VerifyNoOutstandingExpectation(); }
public MetricClient(BadgeUpHttpClient httpClient) { this.m_httpClient = httpClient; }
public async Task WhenSetupWithResponseData_Create_CallsUrlOnceAndReturnsCorrectResult() { var apiKey = BadgeUp.ApiKey.Create(ApiKey); var responseJson = @"{ 'id': 'cjktcmn5o635wmyd0w4ps', 'applicationId': 'g6jtshln48', 'name': 'Achievement name', 'description': 'Achievement description', 'awards': ['award-1','award-2','award-3'], 'options': { 'earnLimit': 5, 'suspended': true }, 'meta': { 'created': '2016-09-12T06:51:35.453Z', 'icon': 'https://example.com/favicon.ico' } }" .Replace("'", "\""); // setup the response action var url = $"{Host}/v2/apps/{apiKey.ApplicationId}/achievements"; var mockHttp = new MockHttpMessageHandler(); var expectedRequest = mockHttp.Expect(HttpMethod.Post, url).Respond("application/json", responseJson); mockHttp.Fallback.Throw(new InvalidOperationException("No matching mock handler")); using (var badgeUpHttpClient = new BadgeUpHttpClient(apiKey, Host)) { badgeUpHttpClient.SetHttpClient(mockHttp.ToHttpClient()); var client = new AchievementClient(badgeUpHttpClient); var result = await client.Create(new Achievement() { Name = "Achievement name", Description = "Achievement description", Awards = new[] { "award-1", "award-2", "award-3" }, // TODO: Add simple EvalTree test once client.Criterion.GetAll() is completed EvalTree = null, Options = new AchievementOptions() { EarnLimit = 5, Suspended = true }, Meta = new AchievementMeta() { Icon = "https://example.com/favicon.ico" } }); Assert.Equal("Achievement name", result.Name); Assert.Equal("Achievement description", result.Description); Assert.Equal("cjktcmn5o635wmyd0w4ps", result.Id); Assert.Equal(new[] { "award-1", "award-2", "award-3" }, result.Awards); Assert.True(result.Options.Suspended); Assert.Equal(5, result.Options.EarnLimit); Assert.Equal(new DateTime(2016, 09, 12, 06, 51, 35, 453), result.Meta.Created); Assert.Equal("https://example.com/favicon.ico", result.Meta.Icon); } mockHttp.VerifyNoOutstandingExpectation(); }
public async Task WhenSetupWithResponseData_Create_CallsUrlOnceAndReturnsCorrectResult() { var apiKey = BadgeUp.ApiKey.Create(ApiKey); var responseJson = @"{ id: '12345', name: 'Criterion', description: 'criterion description', key: 'a:crit', evaluation: { type: 'standard', operator: '@gte', threshold: 5, repeatOptions: { carryOver: true } }, 'meta': { 'created': '2016-09-12T06:51:35.453Z', } }" .Replace("'", "\""); // setup the response action var url = $"{Host}/v2/apps/{apiKey.ApplicationId}/criteria"; var mockHttp = new MockHttpMessageHandler(); var expectedRequest = mockHttp.Expect(HttpMethod.Post, url).Respond("application/json", responseJson); mockHttp.Fallback.Throw(new InvalidOperationException("No matching mock handler")); using (var badgeUpHttpClient = new BadgeUpHttpClient(apiKey, Host)) { badgeUpHttpClient.SetHttpClient(mockHttp.ToHttpClient()); var client = new CriterionClient(badgeUpHttpClient); var result = await client.Create(new Criterion() { Name = "Criterion", Description = "criterion description", Key = "a:crit", Evaluation = new CriterionEvaluation() { Type = CriterionEvaluationType.Standard, Operator = CriterionOperator.GreaterOrEqual, Threshold = 5, RepeatOptions = new CriterionRepeatOptions() { CarryOver = true, }, Period = null, // Period is only used for Timeseries type Multiplicity = null, // Multiplicity is only used for Timeseries type } }); Assert.Equal("Criterion", result.Name); Assert.Equal("criterion description", result.Description); Assert.Equal("a:crit", result.Key); Assert.Equal(CriterionEvaluationType.Standard, result.Evaluation.Type); Assert.Equal(CriterionOperator.GreaterOrEqual, result.Evaluation.Operator); Assert.Equal(5, result.Evaluation.Threshold); Assert.True(result.Evaluation.RepeatOptions.CarryOver); Assert.Null(result.Evaluation.Period); Assert.Null(result.Evaluation.Multiplicity); Assert.Equal(new DateTime(2016, 09, 12, 06, 51, 35, 453), result.Meta.Created); } mockHttp.VerifyNoOutstandingExpectation(); }
internal ProgressClient(BadgeUpHttpClient httpClient) { this.m_httpClient = httpClient; }
public CriterionClient(BadgeUpHttpClient httpClient) { this.m_httpClient = httpClient; }
public EventClient(BadgeUpHttpClient httpClient) { this.m_httpClient = httpClient; }
public AwardClient(BadgeUpHttpClient httpClient) { this.m_httpClient = httpClient; }
public EarnedAchievementClient(BadgeUpHttpClient httpClient) { this.m_httpClient = httpClient; }
public AccountClient(BadgeUpHttpClient httpClient) { this.m_httpClient = httpClient; }
public AchievementIconClient(BadgeUpHttpClient httpClient) { this.m_httpClient = httpClient; }
public ApplicationClient(BadgeUpHttpClient httpClient) { this.m_httpClient = httpClient; }
public async Task WhenSetupWithResponseData_GetAllWithoutQueryParams_CallsUrlOnceAndReturnsCorrectResult() { Assert.False(string.IsNullOrEmpty(EarnedAwardClientTests.ApiKey)); var apiKey = BadgeUp.ApiKey.Create(ApiKey); var responseJson = @"{ 'pages': { 'previous': null, 'next': null }, 'data': [ { 'id': 'cjktcmn5o635wmyd0w4ps', 'applicationId': 'g6jtshln48', 'achievementId': 'cjktccaf8rsfdia9ea565npch', 'earnedAchievementId': 'cjktcmn5n635w69dhfjp3', 'awardId': 'cjktceks5dxfy1n8e04bcnl1g', 'subject': 'subject-1', 'state': 'REDEEMED', 'meta': { 'created': '2016-07-12T06:51:35.453Z' } }, { 'id': 'cjktcmngk629suhbsp3ww', 'applicationId': 'g6jtshln48', 'achievementId': 'cjktccaf8rsfdia9ea565npch', 'earnedAchievementId': 'cjktcmngk629ssk6jufko', 'awardId': 'cjktceks5dxfy1n8e04bcnl1g', 'subject': 'subject-2', 'state': 'APPROVED', 'meta': { 'created': '2016-07-14T06:51:35.844Z' } }, { 'id': 'cjktcmyhl635wpg6qbjxf', 'applicationId': 'g6jtshln48', 'achievementId': 'cjktccaf8rsfdia9ea565npch', 'earnedAchievementId': 'cjktcmyhl635wjshv2kc2', 'awardId': 'cjktceks5dxfy1n8e04bcnl1g', 'subject': 'subject-3', 'state': 'CREATED', 'meta': { 'created': '2016-09-18T06:51:50.137Z' } } ] }" .Replace("'", "\""); // setup the response action var url = $"{Host}/v2/apps/{apiKey.ApplicationId}/earnedawards"; var mockHttp = new MockHttpMessageHandler(); var expectedRequest = mockHttp.Expect(HttpMethod.Get, url).Respond("application/json", responseJson); mockHttp.Fallback.Throw(new InvalidOperationException("No matching mock handler")); using (var badgeUpHttpClient = new BadgeUpHttpClient(apiKey, Host)) { badgeUpHttpClient.SetHttpClient(mockHttp.ToHttpClient()); var client = new EarnedAwardClient(badgeUpHttpClient); // act var result = await client.GetAll(); // assert url was called only once mockHttp.VerifyNoOutstandingExpectation(); // assert result was parsed correctly Assert.NotNull(result); Assert.Equal(3, result.Count); Assert.Equal("cjktcmn5o635wmyd0w4ps", result[0].Id); Assert.Equal("g6jtshln48", result[0].ApplicationId); Assert.Equal("cjktccaf8rsfdia9ea565npch", result[0].AchievementId); Assert.Equal("cjktcmn5n635w69dhfjp3", result[0].EarnedAchievementId); Assert.Equal("cjktceks5dxfy1n8e04bcnl1g", result[0].AwardId); Assert.Equal("subject-1", result[0].Subject); Assert.Equal(EarnedAwardState.Redeemed, result[0].State); Assert.Equal(new DateTime(2016, 07, 12, 06, 51, 35, 453, DateTimeKind.Utc), result[0].Meta.Created); } }
internal EarnedAwardClient(BadgeUpHttpClient httpClient) { this.m_httpClient = httpClient; }