Exemple #1
0
        public void RetrievePetByType_WhenAPIReturnsValidResponse_ReturnsValidPetsCountForEachGender(string ownerGender, int petsCount)
        {
            // Arrange
            OwnerPetsData ownerPetsData = new OwnerPetsData();

            ownerPetsData.Owners = new List <Owners>()
            {
                new Owners()
                {
                    Age    = 20,
                    Gender = "Male",
                    Name   = "John",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Tom", Type = "Cat"
                        },
                        new Pet()
                        {
                            Name = "Garfield", Type = "Dog"
                        }
                    }
                },
                new Owners()
                {
                    Age    = 30,
                    Gender = "Female",
                    Name   = "John",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Tomy", Type = "Cat"
                        },
                    }
                },
                new Owners()
                {
                    Age    = 20,
                    Gender = "Male",
                    Name   = "Johnny",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Fido", Type = "Cat"
                        },
                    }
                }
            };
            _moqPetsDataAccess.Setup(m => m.RetrievePets()).Returns(ownerPetsData);

            // Act
            PetsByGenderResponse petsByGender = _petsBusinessLogic.RetreivePetsByType("Cat");

            //Assert
            Assert.IsTrue(petsByGender.PetsByGenderList.Where(p => p.Gender == ownerGender).First().petsList.Count == petsCount);
        }
Exemple #2
0
        public void RetrievePetByType_WhenAPIReturnsValidResponse_ReturnPetsGroupedByGender()
        {
            // Arrange
            OwnerPetsData ownerPetsData = new OwnerPetsData();

            ownerPetsData.Owners = new List <Owners>()
            {
                new Owners()
                {
                    Age    = 20,
                    Gender = "Male",
                    Name   = "John",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Tom", Type = "Cat"
                        },
                        new Pet()
                        {
                            Name = "Garfield", Type = "Dog"
                        }
                    }
                },
                new Owners()
                {
                    Age    = 30,
                    Gender = "Female",
                    Name   = "John",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Tomy", Type = "Cat"
                        },
                    }
                },
                new Owners()
                {
                    Age    = 20,
                    Gender = "Male",
                    Name   = "Johnny",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Fido", Type = "Cat"
                        },
                    }
                }
            };
            _moqPetsDataAccess.Setup(m => m.RetrievePets()).Returns(ownerPetsData);

            // Act
            PetsByGenderResponse petsByGender = _petsBusinessLogic.RetreivePetsByType("Cat");

            //Assert
            Assert.IsTrue(petsByGender.PetsByGenderList[0].Gender == "Male" && petsByGender.PetsByGenderList[1].Gender == "Female");
        }
Exemple #3
0
        public void WhenAPIReturnsValidResponse_NoErrorsInResponse()
        {
            //Act
            OwnerPetsData ownerPetsData = _petsDataAccess.RetrievePets();

            // Assert
            Assert.IsTrue(ownerPetsData.Errors.Count == 0 && ownerPetsData.Owners.Count > 0);
        }
Exemple #4
0
        public void GroupPetsByGender_WhenPassedPetsOfBothGender_ReturnedPetsGroupedByMaleAndFemaleWithProperCount(string gender, int ownerCountByGender)
        {
            // Arrange
            OwnerPetsData ownerPetsData = new OwnerPetsData();

            ownerPetsData.Owners = new List <Owners>()
            {
                new Owners()
                {
                    Age    = 20,
                    Gender = "Male",
                    Name   = "John",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Tom", Type = "Cat"
                        },
                        new Pet()
                        {
                            Name = "Garfield", Type = "Dog"
                        }
                    }
                },
                new Owners()
                {
                    Age    = 30,
                    Gender = "Female",
                    Name   = "John",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Tomy", Type = "Cat"
                        },
                    }
                },
                new Owners()
                {
                    Age    = 20,
                    Gender = "Male",
                    Name   = "Johnny",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Fido", Type = "Cat"
                        },
                    }
                }
            };

            // Act
            Dictionary <string, List <List <Pet> > > petsGroups = _petsBusinessLogic.GroupPetsByOwnerGender(ownerPetsData);

            // Assert
            Assert.AreEqual(petsGroups[gender].Count, ownerCountByGender, string.Format("Invalid number of {0} Owner(s) in the result", gender));
        }
Exemple #5
0
        public void GroupPetsByGender_WhenOnlyOneGenderHasPets_ReturnPetsGroupedOnlyForThatGender(string gender)
        {
            // Arrange
            OwnerPetsData ownerPetsData = new OwnerPetsData();

            ownerPetsData.Owners = new List <Owners>()
            {
                new Owners()
                {
                    Age    = 20,
                    Gender = gender,
                    Name   = "John",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Tom", Type = "Cat"
                        },
                        new Pet()
                        {
                            Name = "Garfield", Type = "Dog"
                        }
                    }
                },
                new Owners()
                {
                    Age    = 30,
                    Gender = gender,
                    Name   = "John",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Tomy", Type = "Cat"
                        },
                    }
                },
                new Owners()
                {
                    Age    = 20,
                    Gender = gender,
                    Name   = "Johnny",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Fido", Type = "Cat"
                        },
                    }
                }
            };

            // Act
            Dictionary <string, List <List <Pet> > > petsGroups = _petsBusinessLogic.GroupPetsByOwnerGender(ownerPetsData);

            // Assert
            Assert.IsTrue(petsGroups.Keys.Count == 1 && petsGroups.ContainsKey(gender));
        }
Exemple #6
0
        public void GroupPetsByGender_WhenBothOwnersHasPets_ShouldReturnPetsOfBothOwners()
        {
            // Arrange
            OwnerPetsData ownerPetsData = new OwnerPetsData();

            ownerPetsData.Owners = new List <Owners>()
            {
                new Owners()
                {
                    Age    = 20,
                    Gender = "Male",
                    Name   = "John",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Tom", Type = "Cat"
                        },
                        new Pet()
                        {
                            Name = "Garfield", Type = "Dog"
                        }
                    }
                },
                new Owners()
                {
                    Age    = 30,
                    Gender = "Female",
                    Name   = "John",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Tomy", Type = "Cat"
                        },
                    }
                },
                new Owners()
                {
                    Age    = 20,
                    Gender = "Male",
                    Name   = "Johnny",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Fido", Type = "Cat"
                        },
                    }
                }
            };

            // Act
            Dictionary <string, List <List <Pet> > > petsGroups = _petsBusinessLogic.GroupPetsByOwnerGender(ownerPetsData);

            // Assert
            Assert.IsTrue(petsGroups.Keys.Count == 2 && petsGroups.ContainsKey("Male") && petsGroups.ContainsKey("Female"), "Male Or Female Owner are not present in group");
        }
Exemple #7
0
        public void WhenCalled_UndhandledExceptionOccurs_ThrowsException()
        {
            // Arrange
            _moqClient.Setup(m => m.Execute <List <Owners> >(It.IsAny <IRestRequest>())).Throws(new NullReferenceException("Object reference not set to an instance"));

            //Act
            OwnerPetsData ownerPetsData = _petsDataAccess.RetrievePets();


            //Assert
            Assert.IsTrue(ownerPetsData.Errors.Any(e => e.ErrorMessage == "Object reference not set to an instance"));
        }
Exemple #8
0
        public void GroupPetsByGender_WhenSingleOwnerHasNoPets_OwnerWithoutPetsIgnoredWhileGrouping()
        {
            // Arrange
            OwnerPetsData ownerPetsData = new OwnerPetsData();

            ownerPetsData.Owners = new List <Owners>()
            {
                new Owners()
                {
                    Age    = 20,
                    Gender = "Male",
                    Name   = "John",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Tom", Type = "Cat"
                        },
                        new Pet()
                        {
                            Name = "Garfield", Type = "Dog"
                        }
                    }
                },
                new Owners()
                {
                    Age    = 30,
                    Gender = "Female",
                    Name   = "John",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Tomy", Type = "Cat"
                        },
                    }
                },
                new Owners()
                {
                    Age    = 20,
                    Gender = "Male",
                    Name   = "Johnny",
                    Pets   = null
                }
            };

            // Act
            Dictionary <string, List <List <Pet> > > petsGroups = _petsBusinessLogic.GroupPetsByOwnerGender(ownerPetsData);

            // Assert
            Assert.AreEqual(1, petsGroups["Male"].Count, "Owner count does not match");
        }
Exemple #9
0
        public void WhenInvokedAPI_WithInvalidBaseUri_ShouldReturnError()
        {
            // Arrange
            ConfigurationManager.AppSettings["BaseUri"]         = "http://agl-developer-test.azurewebsites.com"; // Invalid base uri
            ConfigurationManager.AppSettings["RetrievePetsUri"] = "/people.json";
            _petsDataAccess = new PetsDataAccess(new RestClient());
            //Act
            OwnerPetsData ownerPetsData = _petsDataAccess.RetrievePets();

            // Assert
            Assert.IsTrue(ownerPetsData.Errors.Any(error => error.StatusCode == 0 &&
                                                   !string.IsNullOrEmpty(error.ErrorMessage)));
        }
Exemple #10
0
        public void WhenInvokedAPIWithInvalidResourceUri_ShouldReturn404NotFoundError()
        {
            // Arrange
            ConfigurationManager.AppSettings["BaseUri"]         = "http://agl-developer-test.azurewebsites.net";
            ConfigurationManager.AppSettings["RetrievePetsUri"] = "/people.jso";  // Inject invalid resource uri
            _petsDataAccess = new PetsDataAccess(new RestClient());

            //Act
            OwnerPetsData ownerPetsData = _petsDataAccess.RetrievePets();

            // Assert
            Assert.IsTrue(ownerPetsData.Errors.Any(error => error.StatusCode == HttpStatusCode.NotFound &&
                                                   !string.IsNullOrEmpty(error.ErrorMessage)));
        }
Exemple #11
0
        /// <summary>
        /// Group pets by Owner's gender
        /// </summary>
        /// <param name="ownerPetsData"></param>
        /// <returns></returns>
        public Dictionary <string, List <List <Pet> > > GroupPetsByOwnerGender(OwnerPetsData ownerPetsData)
        {
            Dictionary <string, List <List <Pet> > > ownerpetsDic = new Dictionary <string, List <List <Pet> > >();
            var ownerGroupedByGender = (from owner in ownerPetsData.Owners
                                        where owner.Pets != null
                                        group owner.Pets by owner.Gender into petsGrp
                                        select new { Gender = petsGrp.Key, Pets = petsGrp.ToList() });

            foreach (var genderGrp in ownerGroupedByGender)
            {
                ownerpetsDic.Add(genderGrp.Gender, genderGrp.Pets);
            }

            return(ownerpetsDic);
        }
Exemple #12
0
        public void WhenCalled_APIRespondsOtherthanSuccess_ReturnsErrorsinResponse(HttpStatusCode statusCode, string errorMessage)
        {
            // Arrange
            var restResponse = new RestResponse <List <Owners> >()
            {
                StatusCode     = statusCode,
                ErrorException = new Exception(errorMessage)
            };

            _moqClient.Setup(m => m.Execute <List <Owners> >(It.IsAny <IRestRequest>())).Returns(restResponse);

            //Act
            OwnerPetsData ownerPetsData = _petsDataAccess.RetrievePets();

            // Assert
            Assert.IsTrue(ownerPetsData.Errors.Any(error => error.StatusCode == statusCode && error.ErrorMessage == errorMessage));
        }
Exemple #13
0
        /// <summary>
        /// Retrieve pets by calling the api
        /// </summary>
        /// <returns></returns>
        public OwnerPetsData RetrievePets()
        {
            OwnerPetsData ownerPetsData = new OwnerPetsData();
            IRestRequest  request;

            try
            {
                _client.BaseUrl = new Uri(PetsBaseUri);
                request         = new RestRequest(ResourceUri, Method.GET);

                // call the api
                var restResponse = _client.Execute <List <Owners> >(request);

                // Api returns successful response
                if (restResponse.StatusCode == HttpStatusCode.OK)
                {
                    ownerPetsData.Owners = restResponse.Data;
                }
                else
                {
                    // Api returned invalid response, map the exception
                    Error error = new Error();
                    error.ErrorMessage = restResponse.ErrorException.Message;
                    error.StatusCode   = restResponse.StatusCode;
                    ownerPetsData.Errors.Add(error);
                }
            }

            //RestSharp.dll returns all the exceptions in the RestResponse.ErrorException object.
            // Hence handling only generic exceptions
            catch (Exception ex)
            {
                ownerPetsData.Errors.Add(new Error {
                    ErrorMessage = ex.Message, StatusCode = HttpStatusCode.InternalServerError
                });
            }

            return(ownerPetsData);
        }
Exemple #14
0
        public void RetrievePetByType_WhenErrorOccurredinDataAccess_ReturnErrorsInResponse()
        {
            // Arrange
            OwnerPetsData ownerPetsData = new OwnerPetsData
            {
                Errors = new List <Error>
                {
                    new Error()
                    {
                        ErrorMessage = "The remote name could not be resolved: 'agl-developer-test.azurewebsites.net'",
                        StatusCode   = 0
                    }
                }
            };

            _moqPetsDataAccess.Setup(m => m.RetrievePets()).Returns(ownerPetsData);

            // Act
            PetsByGenderResponse petsByGender = _petsBusinessLogic.RetreivePetsByType("Cat");

            //Assert
            Assert.IsTrue(petsByGender.Errors.Any(error => error.ErrorMessage == "The remote name could not be resolved: 'agl-developer-test.azurewebsites.net'"));
        }
Exemple #15
0
        public PetsByGenderResponse RetreivePetsByType(string petType)
        {
            PetsByGenderResponse petsByGenderResponse = new PetsByGenderResponse();
            List <PetsByGender>  petsByGenderList     = null;

            try
            {
                // Get data from Data Access
                OwnerPetsData ownerPetsData = _petsDataAccess.RetrievePets();

                if (ownerPetsData != null && ownerPetsData?.Errors.Count == 0)
                {
                    // Group pets by Owner gender
                    Dictionary <string, List <List <Pet> > > petsGroupByOwnerGender = GroupPetsByOwnerGender(ownerPetsData);

                    //Flatten pets under gender
                    Dictionary <string, List <Pet> > flattenedPetsList = FlattenPetsByGenderList(petsGroupByOwnerGender);

                    // Filter and sort pets by name
                    petsByGenderList = FilterPetsByTypeandSortByName(flattenedPetsList, petType);

                    petsByGenderResponse.PetsByGenderList = petsByGenderList;
                }
                else
                {
                    // Map the errors to the response
                    petsByGenderResponse.Errors = ownerPetsData.Errors;
                }
            }
            catch (Exception exception)
            {
                petsByGenderResponse.Errors.Add(new Error {
                    ErrorMessage = exception.Message
                });
            }
            return(petsByGenderResponse);
        }
Exemple #16
0
        public void WhenCalled_ApiReturnsValidResponse_ValidateValidIfResourceUriIsCalled()
        {
            // Arrange
            string resource = string.Empty;
            var    Owners   = new List <Owners>()
            {
                new Owners()
                {
                    Age    = 20,
                    Gender = "Male",
                    Name   = "Sasank",
                    Pets   = new List <Pet>()
                    {
                        new Pet()
                        {
                            Name = "Tommy", Type = "Dog"
                        }
                    }
                }
            };

            var restResponse = new RestResponse <List <Owners> >()
            {
                Data       = Owners,
                StatusCode = HttpStatusCode.OK
            };

            _moqClient.Setup(m => m.Execute <List <Owners> >(It.IsAny <IRestRequest>())).Returns(restResponse).
            Callback <IRestRequest>(rq => { resource = rq.Resource; });

            //Act
            OwnerPetsData ownerPetsData = _petsDataAccess.RetrievePets();

            // Assert
            Assert.AreEqual(_resourceUri, resource);
        }
Exemple #17
0
        public void GroupPetsByGender_WhenNoOwnerHasPets_ShouldNotContainAnyPetsInResponse()
        {
            // Arrange
            OwnerPetsData ownerPetsData = new OwnerPetsData();

            ownerPetsData.Owners = new List <Owners>()
            {
                new Owners()
                {
                    Age    = 20,
                    Gender = "Male",
                    Name   = "John",
                    Pets   = null
                },
                new Owners()
                {
                    Age    = 30,
                    Gender = "Female",
                    Name   = "John",
                    Pets   = null
                },
                new Owners()
                {
                    Age    = 20,
                    Gender = "Male",
                    Name   = "Johnny",
                    Pets   = null
                }
            };

            // Act
            Dictionary <string, List <List <Pet> > > petsGroups = _petsBusinessLogic.GroupPetsByOwnerGender(ownerPetsData);

            // Assert
            Assert.AreEqual(0, petsGroups.Count, "Expected count of Owners is not Zero");
        }