public async void GetConfirmRemoval_ReturnsHttpForbiddenResult_WhenCanRemoveProducerIsFalse()
        {
            // Arrange
            IWeeeClient weeeClient = A.Fake <IWeeeClient>();

            ProducersController controller = new ProducersController(
                A.Dummy <BreadcrumbService>(),
                A.Dummy <ISearcher <ProducerSearchResult> >(),
                () => weeeClient,
                A.Dummy <IWeeeCache>(),
                configurationService);

            A.CallTo(() => weeeClient.SendAsync(A <string> ._, A <GetProducerDetailsByRegisteredProducerId> ._))
            .Returns(
                new ProducerDetailsScheme
            {
                CanRemoveProducer = false
            });

            // Act
            var result = await controller.ConfirmRemoval(A.Dummy <Guid>());

            // Assert
            Assert.IsType <HttpForbiddenResult>(result);
        }
        public async void HttpGet_DownloadProducerEeeHistoryCsv_ShouldReturnFileContentType()
        {
            // Arrange
            BreadcrumbService breadcrumb = A.Dummy <BreadcrumbService>();
            ISearcher <ProducerSearchResult> producerSearcher = A.Dummy <ISearcher <ProducerSearchResult> >();
            IWeeeClient weeeClient = A.Fake <IWeeeClient>();
            CSVFileData csvData    = A.Dummy <CSVFileData>();

            A.CallTo(() => weeeClient.SendAsync(A <string> ._, A <GetProducerEeeDataHistoryCsv> ._))
            .Returns(new CSVFileData
            {
                FileName    = "test.csv",
                FileContent = "123,abc"
            });

            Func <IWeeeClient> weeeClientFunc = A.Fake <Func <IWeeeClient> >();

            A.CallTo(() => weeeClientFunc())
            .Returns(weeeClient);

            ProducersController controller = new ProducersController(breadcrumb, producerSearcher, weeeClientFunc, cache, configurationService);

            //Act
            var result = await controller.DownloadProducerEeeDataHistoryCsv("WEE/AA1111AA");

            //Assert
            Assert.IsType <FileContentResult>(result);
        }
        public async void GetConfirmRemoval_ReturnsConfirmRemovalView_WhenCanRemoveProducerIsTrue()
        {
            // Arrange
            IWeeeClient weeeClient = A.Fake <IWeeeClient>();

            ProducersController controller = new ProducersController(
                A.Dummy <BreadcrumbService>(),
                A.Dummy <ISearcher <ProducerSearchResult> >(),
                () => weeeClient,
                A.Dummy <IWeeeCache>(),
                configurationService);

            A.CallTo(() => weeeClient.SendAsync(A <string> ._, A <GetProducerDetailsByRegisteredProducerId> ._))
            .Returns(
                new ProducerDetailsScheme
            {
                CanRemoveProducer = true
            });

            // Act
            ActionResult result = await controller.ConfirmRemoval(A.Dummy <Guid>());

            // Assert
            ViewResult viewResult = result as ViewResult;

            Assert.NotNull(viewResult);

            Assert.True(string.IsNullOrEmpty(viewResult.ViewName) || viewResult.ViewName.ToLowerInvariant() == "confirmremoval");
        }
        public async Task PostSearchResults_WithSelectedPRN_RedirectsToDetailsAction()
        {
            // Arrange
            BreadcrumbService breadcrumb = A.Dummy <BreadcrumbService>();
            ISearcher <ProducerSearchResult> producerSearcher = A.Dummy <ISearcher <ProducerSearchResult> >();

            Func <IWeeeClient> weeeClient = A.Dummy <Func <IWeeeClient> >();

            ProducersController controller = new ProducersController(breadcrumb, producerSearcher, weeeClient, cache, configurationService);

            SearchResultsViewModel viewModel = new SearchResultsViewModel()
            {
                SelectedRegistrationNumber = "WEE/AA1111AA"
            };

            // Act
            ActionResult result = await controller.SearchResults(viewModel);

            // Assert
            RedirectToRouteResult redirectResult = result as RedirectToRouteResult;

            Assert.NotNull(redirectResult);

            Assert.Equal("Details", redirectResult.RouteValues["action"]);
            Assert.Equal("WEE/AA1111AA", redirectResult.RouteValues["RegistrationNumber"]);
        }
        public async Task GetDetails_FetchesComplianceYearsFromApiAndReturnsViewWithYearValues()
        {
            // Arrange
            BreadcrumbService breadcrumb = A.Dummy <BreadcrumbService>();
            ISearcher <ProducerSearchResult> producerSearcher = A.Dummy <ISearcher <ProducerSearchResult> >();

            IWeeeClient weeeClient = A.Fake <IWeeeClient>();

            A.CallTo(() => weeeClient.SendAsync(A <string> ._, A <GetProducerComplianceYear> ._))
            .WhenArgumentsMatch(a => ((GetProducerComplianceYear)a[1]).RegistrationNumber == "WEE/AA1111AA")
            .Returns(new List <int> {
                2018, 2017, 2016
            });

            Func <IWeeeClient> weeeClientFunc = A.Fake <Func <IWeeeClient> >();

            A.CallTo(() => weeeClientFunc())
            .Returns(weeeClient);

            ProducersController controller = new ProducersController(breadcrumb, producerSearcher, weeeClientFunc, cache, configurationService);

            // Act
            ActionResult result = await controller.Details("WEE/AA1111AA");

            // Assert
            A.CallTo(() => weeeClient.SendAsync(A <string> ._, A <GetProducerComplianceYear> ._))
            .WhenArgumentsMatch(a => ((GetProducerComplianceYear)a[1]).RegistrationNumber == "WEE/AA1111AA")
            .MustHaveHappened();

            ViewResult viewResult = result as ViewResult;

            Assert.NotNull(viewResult);

            Assert.True(string.IsNullOrEmpty(viewResult.ViewName) || viewResult.ViewName.ToLowerInvariant() == "details");

            DetailsViewModel resultsViewModel = viewResult.Model as DetailsViewModel;

            Assert.NotNull(resultsViewModel);

            Assert.Equal(2018, resultsViewModel.SelectedYear);
            Assert.Collection(resultsViewModel.ComplianceYears,
                              r1 => Assert.Equal("2018", r1.Text),
                              r2 => Assert.Equal("2017", r2.Text),
                              r3 => Assert.Equal("2016", r3.Text));
        }
        public async Task PostSearchResults_WithInvalidModel_DoesSearchForTenResultsAndReturnsSearchReturnsView()
        {
            // Arrange
            BreadcrumbService breadcrumb = A.Dummy <BreadcrumbService>();

            List <ProducerSearchResult> fakeResults = new List <ProducerSearchResult>()
            {
                new ProducerSearchResult()
                {
                    Name = "Producer1",
                    RegistrationNumber = "WEE/AA1111AA"
                }
            };

            ISearcher <ProducerSearchResult> producerSearcher = A.Fake <ISearcher <ProducerSearchResult> >();

            A.CallTo(() => producerSearcher.Search("testSearchTerm", 10, false))
            .Returns(fakeResults);

            Func <IWeeeClient> weeeClient = A.Dummy <Func <IWeeeClient> >();

            ProducersController controller = new ProducersController(breadcrumb, producerSearcher, weeeClient, cache, configurationService);

            SearchResultsViewModel viewModel = new SearchResultsViewModel {
                SearchTerm = "testSearchTerm"
            };

            controller.ModelState.AddModelError("SomeProperty", "Exception");

            // Act
            ActionResult result = await controller.SearchResults(viewModel);

            // Assert
            ViewResult viewResult = result as ViewResult;

            Assert.NotNull(viewResult);

            Assert.True(string.IsNullOrEmpty(viewResult.ViewName) || viewResult.ViewName.ToLowerInvariant() == "searchresults");

            SearchResultsViewModel resultsViewModel = viewResult.Model as SearchResultsViewModel;

            Assert.NotNull(resultsViewModel);

            Assert.Contains(resultsViewModel.Results, r => r.RegistrationNumber == "WEE/AA1111AA");
        }
        public async Task GetSearch_ReturnsSearchView()
        {
            // Arrange
            BreadcrumbService breadcrumb = A.Dummy <BreadcrumbService>();
            ISearcher <ProducerSearchResult> producerSearcher = A.Dummy <ISearcher <ProducerSearchResult> >();
            Func <IWeeeClient> weeeClient = A.Dummy <Func <IWeeeClient> >();

            ProducersController controller = new ProducersController(breadcrumb, producerSearcher, weeeClient, cache, configurationService);

            // Act
            ActionResult result = await controller.Search();

            // Assert
            ViewResult viewResult = result as ViewResult;

            Assert.NotNull(viewResult);

            Assert.True(string.IsNullOrEmpty(viewResult.ViewName) || viewResult.ViewName.ToLowerInvariant() == "search");
        }
        public async Task FetchDetails_FetchesDetailsFromApiAndReturnsDetailsView()
        {
            // Arrange
            BreadcrumbService breadcrumb = A.Dummy <BreadcrumbService>();
            ISearcher <ProducerSearchResult> producerSearcher = A.Dummy <ISearcher <ProducerSearchResult> >();

            IWeeeClient weeeClient = A.Fake <IWeeeClient>();

            A.CallTo(() => weeeClient.SendAsync(A <string> ._, A <GetProducerComplianceYear> ._))
            .WhenArgumentsMatch(a => ((GetProducerComplianceYear)a[1]).RegistrationNumber == "WEE/AA1111AA")
            .Returns(new List <int> {
                2018, 2017, 2016
            });

            ProducerDetails producerDetails = A.Dummy <ProducerDetails>();

            A.CallTo(() => weeeClient.SendAsync(A <string> ._, A <GetProducerDetails> ._))
            .WhenArgumentsMatch(a => ((GetProducerDetails)a[1]).RegistrationNumber == "WEE/AA1111AA")
            .Returns(producerDetails);

            Func <IWeeeClient> weeeClientFunc = A.Fake <Func <IWeeeClient> >();

            A.CallTo(() => weeeClientFunc())
            .Returns(weeeClient);

            ProducersController controller = new ProducersController(breadcrumb, producerSearcher, weeeClientFunc, cache, configurationService);

            // Act
            ActionResult result = await controller.FetchDetails("WEE/AA1111AA", 2015);

            // Assert
            A.CallTo(() => weeeClient.SendAsync(A <string> ._, A <GetProducerDetails> ._))
            .WhenArgumentsMatch(a => ((GetProducerDetails)a[1]).RegistrationNumber == "WEE/AA1111AA")
            .MustHaveHappened();

            PartialViewResult viewResult = result as PartialViewResult;

            Assert.NotNull(viewResult);

            Assert.True(string.IsNullOrEmpty(viewResult.ViewName) || viewResult.ViewName.ToLowerInvariant() == "_detailsresults");

            Assert.Equal(producerDetails, viewResult.Model);
        }
        public async Task PostConfirmRemoval_WithInvalidModel_ReturnsConfirmRemovalView()
        {
            // Arrange
            ProducersController controller = new ProducersController(
                A.Dummy <BreadcrumbService>(),
                A.Dummy <ISearcher <ProducerSearchResult> >(),
                () => A.Dummy <IWeeeClient>(),
                A.Dummy <IWeeeCache>(),
                configurationService);

            controller.ModelState.AddModelError("SomeProperty", "Exception");

            // Act
            ActionResult result = await controller.ConfirmRemoval(A.Dummy <Guid>(), A.Dummy <ConfirmRemovalViewModel>());

            // Assert
            ViewResult viewResult = result as ViewResult;

            Assert.NotNull(viewResult);

            Assert.True(string.IsNullOrEmpty(viewResult.ViewName) || viewResult.ViewName.ToLowerInvariant() == "confirmremoval");
        }
        public async Task PostSearch_WithInvalidModel_ReturnsSearchView()
        {
            // Arrange
            BreadcrumbService breadcrumb = A.Dummy <BreadcrumbService>();
            ISearcher <ProducerSearchResult> producerSearcher = A.Dummy <ISearcher <ProducerSearchResult> >();
            Func <IWeeeClient> weeeClient = A.Dummy <Func <IWeeeClient> >();

            ProducersController controller = new ProducersController(breadcrumb, producerSearcher, weeeClient, cache, configurationService);

            SearchViewModel viewModel = new SearchViewModel();

            controller.ModelState.AddModelError("SomeProperty", "Exception");

            // Act
            ActionResult result = await controller.Search(viewModel);

            // Assert
            ViewResult viewResult = result as ViewResult;

            Assert.NotNull(viewResult);

            Assert.True(string.IsNullOrEmpty(viewResult.ViewName) || viewResult.ViewName.ToLowerInvariant() == "search");
        }
        public async void GetConfirmRemoval_CallsApiForSpecifiedRegisteredProducer_AndPopulatesViewModel()
        {
            // Arrange
            Guid registeredProducerId = new Guid("9F253FE4-B644-4EA1-B58E-19C735512449");

            ProducerDetailsScheme producerDetailsScheme = new ProducerDetailsScheme
            {
                CanRemoveProducer = true
            };

            IWeeeClient weeeClient = A.Fake <IWeeeClient>();

            A.CallTo(() => weeeClient.SendAsync(A <string> ._, A <GetProducerDetailsByRegisteredProducerId> ._))
            .WhenArgumentsMatch(a => a.Get <GetProducerDetailsByRegisteredProducerId>("request").RegisteredProducerId == registeredProducerId)
            .Returns(producerDetailsScheme);

            ProducersController controller = new ProducersController(
                A.Dummy <BreadcrumbService>(),
                A.Dummy <ISearcher <ProducerSearchResult> >(),
                () => weeeClient,
                A.Dummy <IWeeeCache>(),
                configurationService);

            // Act
            ActionResult result = await controller.ConfirmRemoval(registeredProducerId);

            // Assert
            ViewResult viewResult = result as ViewResult;

            Assert.NotNull(viewResult);

            ConfirmRemovalViewModel viewModel = viewResult.Model as ConfirmRemovalViewModel;

            Assert.NotNull(viewModel);

            Assert.Equal(producerDetailsScheme, viewModel.Producer);
        }