public async Task Given_A_Valid_OrganisationService_And_OrganisationName_And_OrganisationRequest_When_Call_UpdateOrganisationAsync_ShouldReturns_CreatedAtRouteResult(string organisationName)
        {
            var organisation = new DataContracts.OrganisationRegistration {
                Name = organisationName
            };
            var moqService = new Mock <IOrganisationService>();

            moqService
            .Setup(o => o.RegisterAsync(It.IsAny <DataContracts.OrganisationRegistration>()))
            .ReturnsAsync(organisation)
            .Verifiable();

            var controller = new WebAPI.Controllers.OrganisationController();
            var routeName  = nameof(controller.GetOrganisationAsync);
            var result     = await controller.RegisterOrganisationAsync(organisationName, organisation, moqService.Object);

            moqService.Verify();

            Assert.IsType <CreatedAtRouteResult>(result);
            var createdObjectResult = (CreatedAtRouteResult)result;

            Assert.NotNull(createdObjectResult);
            Assert.NotNull(createdObjectResult.Value);
            Assert.Equal(routeName, createdObjectResult.RouteName);
            Assert.NotNull((DataContracts.Organisation)createdObjectResult.Value);
            Assert.Equal(organisation.Name, ((DataContracts.Organisation)createdObjectResult.Value).Name);
        }
        public async Task Given_A_Valid_OrganisationService_And_OrganisationName_When_Call_GetOrganisationAsync_ShouldReturns_OkObjectResult(string organisationName)
        {
            var moqService = new Mock <IOrganisationService>();

            moqService
            .Setup(o => o.GetByOrganisationNameAsync(It.IsAny <string>()))
            .ReturnsAsync(() => new DataContracts.Organisation {
                Name = organisationName
            })
            .Verifiable();

            var controller = new WebAPI.Controllers.OrganisationController();
            var result     = await controller.GetOrganisationAsync(organisationName, moqService.Object);

            moqService.Verify();

            Assert.IsType <OkObjectResult>(result);
            var okObjectResult = (OkObjectResult)result;

            Assert.NotNull(okObjectResult);
            Assert.NotNull(okObjectResult.Value);
            var organisation = (DataContracts.Organisation)okObjectResult.Value;

            Assert.NotNull(organisation);
            Assert.Equal(organisationName, organisation.Name);
        }
        public async Task  Given_A_Invalid_OrganisationService_When_Call_DeleteOrganisationAsync_ShouldReturns_InternalServerError(string organisationName)
        {
            var controller = new WebAPI.Controllers.OrganisationController();
            var result     = await controller.DeleteOrganisationAsync(organisationName, null);

            Assert.IsType <StatusCodeResult>(result);
            var internalServerErrorResult = (StatusCodeResult)result;

            Assert.NotNull(internalServerErrorResult);
            Assert.Equal((int)HttpStatusCode.InternalServerError, internalServerErrorResult.StatusCode);
        }
        public async Task  Given_A_Invalid_OrganisationName_When_Call_DeleteOrganisationAsync_ShouldReturns_BadRequest(string organisationName)
        {
            var controller = new WebAPI.Controllers.OrganisationController();
            var result     = await controller.DeleteOrganisationAsync(organisationName, null);

            Assert.IsType <BadRequestObjectResult>(result);
            var badRequestResult = (BadRequestObjectResult)result;

            Assert.NotNull(badRequestResult);
            Assert.NotNull(badRequestResult.Value);
        }
        public async Task Given_A_Invalid_OrganisationService_When_Call_GetOrganisationAsync_ShouldReturns_InternalServerError()
        {
            var controller = new WebAPI.Controllers.OrganisationController();
            var result     = await controller.GetOrganisationAsync(Guid.NewGuid().ToString(), null);

            Assert.IsType <StatusCodeResult>(result);
            var statusResult = (StatusCodeResult)result;

            Assert.NotNull(statusResult);
            Assert.Equal(statusResult.StatusCode, (int)HttpStatusCode.InternalServerError);
        }
        public async Task  Given_A_Invalid_OrganisationService_When_Call_UpdateOrganisationAsync_ShouldReturns_InternalServerError()
        {
            var controller = new WebAPI.Controllers.OrganisationController();
            var result     = await controller.UpdateOrganisationAsync("Apple", new DataContracts.Organisation {
                Name = "Apple"
            }, null);

            Assert.IsType <StatusCodeResult>(result);
            var statusCodeResult = (StatusCodeResult)result;

            Assert.NotNull(statusCodeResult);
            Assert.Equal(statusCodeResult.StatusCode, (int)HttpStatusCode.InternalServerError);
        }
        public async Task  Given_A_Invalid_OrganisationName_And_Request_Organisation_Name_Is_Different_When_Call_UpdateOrganisationAsync_ShouldReturns_BadRequest(string organisationName)
        {
            var controller = new WebAPI.Controllers.OrganisationController();
            var result     = await controller.UpdateOrganisationAsync(organisationName, new DataContracts.Organisation {
                Name = "Apple"
            }, null);

            Assert.IsType <BadRequestObjectResult>(result);
            var badRequestResult = (BadRequestObjectResult)result;

            Assert.NotNull(badRequestResult);
            Assert.NotNull(badRequestResult.Value);
        }
        public async Task  Given_A_Invalid_OrganisationService_Is_Null_When_Call_RegisterOrganisationAsync_ShouldReturns_InternalServerError(string organisationName)
        {
            var controller = new WebAPI.Controllers.OrganisationController();
            var result     = await controller.RegisterOrganisationAsync(organisationName, new DataContracts.OrganisationRegistration {
                Name = organisationName
            }, null);

            Assert.IsType <StatusCodeResult>(result);
            var statusCodeResult = (StatusCodeResult)result;

            Assert.NotNull(statusCodeResult);
            Assert.Equal(statusCodeResult.StatusCode, (int)HttpStatusCode.InternalServerError);
        }
        public async Task  Given_A_Valid_OrganisationName_And_OrganisationService_When_Call_DeleteOrganisationAsync_ShouldReturns_NoContentResult(string organisationName)
        {
            var moqService = new Mock <IOrganisationService>();

            moqService
            .Setup(o => o.DeleteByOrganisationNameAsync(It.IsAny <string>()))
            .Returns(Task.CompletedTask)
            .Verifiable();

            var controller = new WebAPI.Controllers.OrganisationController();
            var result     = await controller.DeleteOrganisationAsync(organisationName, moqService.Object);

            moqService.Verify();
            Assert.IsType <NoContentResult>(result);
        }
        public async Task Given_A_Not_Exists_OrganisationName_When_Call_GetOrganisationAsync_ShouldReturns_NotFoundRequest(string organisationName)
        {
            var moqService = new Mock <IOrganisationService>();

            moqService
            .Setup(o => o.GetByOrganisationNameAsync(It.IsAny <string>()))
            .ReturnsAsync(() => null)
            .Verifiable();

            var controller = new WebAPI.Controllers.OrganisationController();
            var result     = await controller.GetOrganisationAsync(organisationName, moqService.Object);

            moqService.Verify();
            Assert.IsType <NotFoundResult>(result);
        }
        public async Task  Given_A_Invalid_OrganisationName_Not_Registered_When_Call_UpdateOrganisationAsync_ShouldReturns_BadRequest(string organisationName)
        {
            var moqService = new Mock <IOrganisationService>();

            moqService
            .Setup(o => o.UpdateAsync(It.IsAny <DataContracts.Organisation>()))
            .ReturnsAsync(() => null)
            .Verifiable();

            var controller = new WebAPI.Controllers.OrganisationController();
            var result     = await controller.UpdateOrganisationAsync(organisationName, new DataContracts.Organisation {
                Name = organisationName
            }, moqService.Object);

            moqService.Verify();
            Assert.IsType <NotFoundResult>(result);
        }
        public async Task  Given_A_Invalid_OrganisationName_Already_Registered_When_Call_RegisterOrganisationAsync_ShouldReturns_BadRequest(string organisationName)
        {
            var moqService = new Mock <IOrganisationService>();

            moqService
            .Setup(o => o.RegisterAsync(It.IsAny <DataContracts.OrganisationRegistration>()))
            .ThrowsAsync(new NameAlreadyUsedException(organisationName))
            .Verifiable();

            var controller = new WebAPI.Controllers.OrganisationController();
            var result     = await controller.RegisterOrganisationAsync(organisationName, new DataContracts.OrganisationRegistration {
                Name = organisationName
            }, moqService.Object);

            moqService.Verify();
            Assert.IsType <BadRequestObjectResult>(result);
            var badRequestResult = (BadRequestObjectResult)result;

            Assert.NotNull(badRequestResult);
            Assert.NotNull(badRequestResult.Value);
        }