Esempio n. 1
0
        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();
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 6
0
        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);
        }
Esempio n. 8
0
        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();
        }
Esempio n. 9
0
 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();
        }
Esempio n. 11
0
        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;
 }
Esempio n. 14
0
 public EventClient(BadgeUpHttpClient httpClient)
 {
     this.m_httpClient = httpClient;
 }
Esempio n. 15
0
 public AwardClient(BadgeUpHttpClient httpClient)
 {
     this.m_httpClient = httpClient;
 }
 public EarnedAchievementClient(BadgeUpHttpClient httpClient)
 {
     this.m_httpClient = httpClient;
 }
 public AccountClient(BadgeUpHttpClient httpClient)
 {
     this.m_httpClient = httpClient;
 }
Esempio n. 18
0
 public AchievementIconClient(BadgeUpHttpClient httpClient)
 {
     this.m_httpClient = httpClient;
 }
Esempio n. 19
0
 public ApplicationClient(BadgeUpHttpClient httpClient)
 {
     this.m_httpClient = httpClient;
 }
Esempio n. 20
0
        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);
            }
        }
Esempio n. 21
0
 internal EarnedAwardClient(BadgeUpHttpClient httpClient)
 {
     this.m_httpClient = httpClient;
 }