public async Task ItShouldReturnTheFirstResultWhenTheSpfStateExists()
        {
            SpfInfoResponse state = new SpfInfoResponse("ncsc.gov.uk", SpfState.Created);

            A.CallTo(() => _spfService.GetSpfForDomain(A <string> ._))
            .Returns(Task.FromResult(state));

            ObjectResult response = (ObjectResult)await _sut.GetSpf(new SpfDomainRequest { Domain = "ncsc.gov.uk" });

            Assert.AreSame(response.Value, state);
        }
        public async Task PublishesDomainMissingMessageWhenDomainDoesNotExist()
        {
            A.CallTo(() => _dao.GetSpfForDomain("testDomain"))
            .Returns(Task.FromResult <SpfInfoResponse>(null));

            SpfInfoResponse result = await _spfService.GetSpfForDomain("testDomain");

            A.CallTo(() => _messagePublisher.Publish(A <DomainMissing> ._, A <string> ._))
            .MustHaveHappenedOnceExactly();
            Assert.AreEqual(null, result);
        }
        public async Task <SpfInfoResponse> GetSpfForDomain(string requestDomain)
        {
            SpfInfoResponse response = await _dao.GetSpfForDomain(requestDomain);

            if (response is null)
            {
                await _messagePublisher.Publish(new DomainMissing(requestDomain), _config.MicroserviceOutputSnsTopicArn);
            }

            return(response);
        }
        public async Task DoesNotPublishDomainMissingMessageWhenDomainExists()
        {
            SpfInfoResponse spfInfoResponse = new SpfInfoResponse("", SpfState.Created);

            A.CallTo(() => _dao.GetSpfForDomain("testDomain"))
            .Returns(Task.FromResult(spfInfoResponse));

            SpfInfoResponse result = await _spfService.GetSpfForDomain("testDomain");

            A.CallTo(() => _messagePublisher.Publish(A <DomainMissing> ._, A <string> ._))
            .MustNotHaveHappened();
            Assert.AreSame(spfInfoResponse, result);
        }
        public async Task <IActionResult> GetSpf(SpfDomainRequest request)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(new ErrorResponse(ModelState.Values)));
            }

            SpfInfoResponse response = await _spfService.GetSpfForDomain(request.Domain);

            if (response == null)
            {
                return(new NotFoundObjectResult(new ErrorResponse($"No Spf found for {request.Domain}",
                                                                  ErrorStatus.Information)));
            }

            return(new ObjectResult(response));
        }