public async Task GivenOKResult_WhenResourceRequested_ThenProviderShouldReturnOKResultWithPokemonContent()
        {
            //Arrange
            string pokemonName = "testemon";

            PokeApiNet.Pokemon testPokemon = new PokeApiNet.Pokemon()
            {
                Id        = 1,
                Name      = pokemonName,
                Height    = 123,
                IsDefault = true
            };

            _mockPokeApiClient.Setup(p => p.GetResourceAsync <PokeApiNet.Pokemon>(It.IsAny <string>())).ReturnsAsync(testPokemon);
            var pokemonProvider = new PokemonProvider(_mockLoggerFactory, _mockPokeApiClient.Object);

            // Act
            var pokemonResult = await pokemonProvider.GetPokemon(pokemonName);

            // Assert
            pokemonResult.Should().BeOfType(typeof(ServiceResult <PokeApiNet.Pokemon>));
            pokemonResult.Content.Should().NotBeNull();
            pokemonResult.Content.Name.Should().Be(pokemonName);
            pokemonResult.Result.Should().Be(Result.OK);
        }
        public void GenerateRandomPokemonMultipleAllowDuplicatesTest()
        {
            // SetUP
            var level = 100;
            var low   = 1;
            var high  = 10;

            _config.Value.Configuration.RandomBagMinCount = 0;

            // Mock
            _mockPokemonRepository.Setup(m => m.GetRandomBagPokemon(level)).Returns(Enumerable.Range(low, high));
            _mockProbabilityUtility.Setup(m => m.ChooseWithProbability(It.IsNotNull <IList <IChoice> >()))
            .Returns <IList <IChoice> >(l => l
                                        .Select((choice, index) => new { choice, index })
                                        .OrderByDescending(item => item.choice.Probability)
                                        .First().index);

            // Generate
            var provider = new PokemonProvider(_mockProbabilityUtility.Object, _mockPokemonRepository.Object, _config);

            for (var i = low; i < high * 2; i++)
            {
                provider.ReloadRandomBag(level);
                var poke = provider.GenerateRandomPokemon(level);
                Assert.NotNull(poke);
                Assert.InRange(poke.SpeciesId, low, high);
            }

            // Verify
            _mockPokemonRepository.VerifyAll();
            _mockProbabilityUtility.VerifyAll();
        }
Esempio n. 3
0
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddOptions();
            var appConfiguration = new ConfigurationBuilder()
                                   .AddEnvironmentVariables()
                                   .Build();
            var pokemonConfig = new BaseConfiguration();
            var shakespeareTransformProvider = new ShakespeareTextTransformProvider();
            var pokemonProvider = new PokemonProvider();

            pokemonConfig.SetEnvironmentConfiguration(appConfiguration);

            services.AddSingleton(pokemonConfig);
            services.AddSingleton <IPokemonProvider>(pokemonProvider);
            services.AddSingleton <ITextTransformProvider>(shakespeareTransformProvider);

            services.AddLogging(
                builder =>
            {
                builder
                .AddFilter("Microsoft", LogLevel.Information)
                .AddFilter("System", LogLevel.Information)
                .AddConsole();
            });
        }
        public async Task GivenOKResult_WhenResourceRequested_ThenProviderShouldReturnOKResultWithSpeciesContent()
        {
            // Arrange
            var speciesName = "Species 2";

            PokeApiNet.PokemonSpecies testPokemonSpecies = new PokeApiNet.PokemonSpecies()
            {
                Id                = 2,
                Name              = speciesName,
                Order             = 1,
                FlavorTextEntries = new List <PokeApiNet.PokemonSpeciesFlavorTexts>()
                {
                    new PokeApiNet.PokemonSpeciesFlavorTexts()
                    {
                        FlavorText = "Flavor text 1",
                        Language   = new PokeApiNet.NamedApiResource <PokeApiNet.Language>()
                        {
                            Name = "en",
                            Url  = "url"
                        }
                    },
                    new PokeApiNet.PokemonSpeciesFlavorTexts()
                    {
                        FlavorText = "Flavor text 2",
                        Language   = new PokeApiNet.NamedApiResource <PokeApiNet.Language>()
                        {
                            Name = "en",
                            Url  = "url"
                        }
                    },
                    new PokeApiNet.PokemonSpeciesFlavorTexts()
                    {
                        FlavorText = "Flavor text 3",
                        Language   = new PokeApiNet.NamedApiResource <PokeApiNet.Language>()
                        {
                            Name = "fr",
                            Url  = "url"
                        }
                    }
                }
            };

            var speciesRequest = new PokeApiNet.NamedApiResource <PokeApiNet.PokemonSpecies>()
            {
                Name = "test species", Url = "test url"
            };

            _mockPokeApiClient.Setup(p => p.GetResourceAsync(It.IsAny <PokeApiNet.UrlNavigation <PokeApiNet.PokemonSpecies> >())).ReturnsAsync(testPokemonSpecies);
            var pokemonProvider = new PokemonProvider(_mockLoggerFactory, _mockPokeApiClient.Object);

            // Act
            var speciesResult = await pokemonProvider.GetPokemonSpecies(speciesRequest);

            // Assert
            speciesResult.Should().BeOfType(typeof(ServiceResult <PokeApiNet.PokemonSpecies>));
            speciesResult.Content.Should().NotBeNull();
            speciesResult.Content.Name.Should().Be(speciesName);
            speciesResult.Content.FlavorTextEntries.Count.Should().Be(3);
        }
        public void GenerateRandomPokemonBadLevelTest(int level)
        {
            // Assert
            var provider = new PokemonProvider(_mockProbabilityUtility.Object, _mockPokemonRepository.Object, _config);

            Assert.Throws <ArgumentOutOfRangeException>(() => provider.GenerateRandomPokemon(level));

            // Verify
            _mockPokemonRepository.VerifyAll();
            _mockProbabilityUtility.VerifyAll();
        }
        public void GeneratePokemonBadSpeciesTest(int speciesId)
        {
            // Assert
            var provider = new PokemonProvider(_mockProbabilityUtility.Object, _mockPokemonRepository.Object, _config);

            Assert.Throws <ArgumentOutOfRangeException>(() => provider.GeneratePokemon(speciesId, 50));

            // Verify
            _mockPokemonRepository.VerifyAll();
            _mockProbabilityUtility.VerifyAll();
        }
Esempio n. 7
0
        public async void Should_return_NOT_FOUND_for_non_ASCII_invalid_name(string name)
        {
            var logger            = PokemonControllerTests.GetMockLogger();
            var config            = Options.Create(new BaseConfiguration());
            var transformProvider = new ShakespeareTextTransformProvider();
            var pokemonProvider   = new PokemonProvider();
            var pokemonController = new PokemonController(logger, config, pokemonProvider, transformProvider);

            ContentResult response = (await pokemonController.Get(name)) as ContentResult;

            Assert.NotNull(response);
            Assert.Equal(response.StatusCode, (int)HttpStatusCode.NotFound);
        }
Esempio n. 8
0
        public async void Should_handle_Shakespeare_endpoint_not_available(string name, string shakespeareEndpoint)
        {
            var logger = PokemonControllerTests.GetMockLogger();
            var config = Options.Create(new BaseConfiguration());

            config.Value.TextTransformConfiguration.EndpointBaseUrl = shakespeareEndpoint;
            var transformProvider = new ShakespeareTextTransformProvider();
            var pokemonProvider   = new PokemonProvider();
            var pokemonController = new PokemonController(logger, config, pokemonProvider, transformProvider);

            ContentResult response = (await pokemonController.Get(name)) as ContentResult;

            Assert.NotNull(response);
            Assert.Equal(response.StatusCode, (int)HttpStatusCode.RequestTimeout);
        }
Esempio n. 9
0
        public async void Should_return_a_description_and_the_correct_name(string name)
        {
            var logger            = PokemonControllerTests.GetMockLogger();
            var config            = Options.Create(new BaseConfiguration());
            var transformProvider = new ShakespeareTextTransformProvider();
            var pokemonProvider   = new PokemonProvider();
            var pokemonController = new PokemonController(logger, config, pokemonProvider, transformProvider);
            var response          = (await pokemonController.Get(name)) as OkObjectResult;

            Assert.NotNull(response);
            Assert.Equal(response.StatusCode, (int)HttpStatusCode.OK);

            PokemonResponseDTO content = response.Value as PokemonResponseDTO;

            Assert.Equal(name, content.Name);
        }
        public void GeneratePokemonReducesRandomBagTest()
        {
            // SetUP
            var level = 100;
            var low   = 1;
            var high  = 10;

            _config.Value.Configuration.RandomBagMinCount = 0;

            // Mock
            _mockPokemonRepository.Setup(m => m.GetPossiblePokemon(It.IsAny <int>())).Returns(Enumerable.Range(low, high));
            _mockPokemonRepository.Setup(m => m.GetRandomBagPokemon(It.IsAny <int>())).Returns(Enumerable.Range(low, high));
            _mockProbabilityUtility.Setup(m => m.ChooseWithProbability(It.IsNotNull <IList <IChoice> >()))
            .Returns <IList <IChoice> >(l => l
                                        .Select((choice, index) => new { choice, index })
                                        .OrderByDescending(item => item.choice.Probability)
                                        .First().index);

            // Generate
            var provider = new PokemonProvider(_mockProbabilityUtility.Object, _mockPokemonRepository.Object, _config);
            var chosen   = new List <int>();

            for (var i = low; i < high / 2; i++)
            {
                var poke = provider.GeneratePokemon(i, level);
                Assert.NotNull(poke);
                Assert.InRange(poke.SpeciesId, low, high);
                chosen.Add(poke.SpeciesId);
            }

            // Generate Random
            for (var i = high / 2; i < high; i++)
            {
                var poke = provider.GenerateRandomPokemon(level);
                Assert.NotNull(poke);
                Assert.InRange(poke.SpeciesId, low, high);
                Assert.DoesNotContain(poke.SpeciesId, chosen);
            }

            // Verify
            _mockPokemonRepository.VerifyAll();
            _mockProbabilityUtility.VerifyAll();
            _mockPokemonRepository.Verify(m => m.GetRandomBagPokemon(It.IsAny <int>()), Times.Once);
        }
        public void GenerateRandomPokemonProbabilitiesTest()
        {
            // SetUP
            var level = 100;
            var low   = 1;
            var high  = 10;

            _config.Value.Configuration.LegendaryPokemon.Add(low);
            _config.Value.Configuration.SpecialPokemon.Add(low + 1);
            _config.Value.Configuration.DisabledPokemon.Add(low + 2);
            _config.Value.Configuration.ForbiddenPokemon.Add(low + 3);

            // Mock
            _mockPokemonRepository.Setup(m => m.GetRandomBagPokemon(level)).Returns(Enumerable.Range(low, high));
            _mockProbabilityUtility.Setup(m => m.ChooseWithProbability(It.IsNotNull <IList <IChoice> >()))
            .Returns <IList <IChoice> >(l =>
            {
                Assert.Equal(_config.Value.Configuration.PokemonLiklihood.Legendary, l.Cast <PokemonChoice>().Single(choice => choice.PokemonId == low + 0).Probability);
                Assert.Equal(_config.Value.Configuration.PokemonLiklihood.Special, l.Cast <PokemonChoice>().Single(choice => choice.PokemonId == low + 1).Probability);
                Assert.Equal(_config.Value.Configuration.PokemonLiklihood.Ignored, l.Cast <PokemonChoice>().Single(choice => choice.PokemonId == low + 2).Probability);
                Assert.Equal(_config.Value.Configuration.PokemonLiklihood.Ignored, l.Cast <PokemonChoice>().Single(choice => choice.PokemonId == low + 3).Probability);
                Assert.Equal(_config.Value.Configuration.PokemonLiklihood.Standard, l.Cast <PokemonChoice>().Single(choice => choice.PokemonId == low + 4).Probability);

                return(l
                       .Select((choice, index) => new { choice, index })
                       .OrderByDescending(item => item.choice.Probability)
                       .First().index);
            });

            // Generate
            var provider = new PokemonProvider(_mockProbabilityUtility.Object, _mockPokemonRepository.Object, _config);
            var poke     = provider.GenerateRandomPokemon(level);

            // Assert
            Assert.NotNull(poke);
            Assert.InRange(poke.SpeciesId, low, high);

            // Verify
            _mockPokemonRepository.VerifyAll();
            _mockProbabilityUtility.VerifyAll();
        }
        public void GeneratePokemonNotPossibleTest()
        {
            // SetUP
            var level = 100;
            var low   = 1;
            var high  = 10;

            // Mock
            _mockPokemonRepository.Setup(m => m.GetPossiblePokemon(It.IsAny <int>())).Returns(Enumerable.Range(low, high));
            _mockPokemonRepository.Setup(m => m.GetRandomBagPokemon(It.IsAny <int>())).Returns(Enumerable.Range(low, high));

            // Generate
            var provider = new PokemonProvider(_mockProbabilityUtility.Object, _mockPokemonRepository.Object, _config);

            // Assert
            Assert.Throws <ArgumentOutOfRangeException>(() => provider.GeneratePokemon(high + 1, level));

            // Verify
            _mockPokemonRepository.VerifyAll();
            _mockProbabilityUtility.VerifyAll();
        }
        public async Task GivenApiThrowsHTTPException_WhenResourceRequested_ThenProviderShouldReturnNotFoundResult()
        {
            // Arrange
            string pokemonName     = "NonExistant";
            var    thrownException = new Exception("404 Not Found")
            {
                Source = "System.Net.HTTP"
            };

            _mockPokeApiClient.Setup(p => p.GetResourceAsync <PokeApiNet.Pokemon>(It.IsAny <string>())).ThrowsAsync(thrownException);
            var pokemonProvider = new PokemonProvider(_mockLoggerFactory, _mockPokeApiClient.Object);

            // Act
            var pokemonResult = await pokemonProvider.GetPokemon(pokemonName);

            // Assert
            pokemonResult.Should().BeOfType(typeof(ServiceResult <PokeApiNet.Pokemon>));
            pokemonResult.Content.Should().BeNull();
            pokemonResult.Message.Should().NotBeNull();
            pokemonResult.Result.Should().Be(Result.NotFound);
        }
        public void GeneratePokemonTest()
        {
            // SetUP
            var level = 100;
            var low   = 1;
            var high  = 10;

            // Mock
            _mockPokemonRepository.Setup(m => m.GetPossiblePokemon(It.IsAny <int>())).Returns(Enumerable.Range(low, high));
            _mockPokemonRepository.Setup(m => m.GetRandomBagPokemon(It.IsAny <int>())).Returns(Enumerable.Range(low, high));

            // Generate
            var provider = new PokemonProvider(_mockProbabilityUtility.Object, _mockPokemonRepository.Object, _config);
            var poke     = provider.GeneratePokemon(1, level);

            // Assert
            Assert.NotNull(poke);
            Assert.InRange(poke.SpeciesId, low, high);

            // Verify
            _mockPokemonRepository.VerifyAll();
            _mockProbabilityUtility.VerifyAll();
        }