public void PublisherDeterminesStatusAndDispatchesIt()
        {
            Message rootMessage            = CreateInfoMessage();
            Message recordsMessage         = CreateInfoMessage();
            Message recordsRecordsMessages = CreateInfoMessage();

            SpfRecordsEvaluated message = new SpfRecordsEvaluated("testDomain", new SpfRecords(new List <SpfRecord> {
                new SpfRecord(null, null, null, new List <Message> {
                    recordsRecordsMessages
                }, false)
            }, 0, new List <Message> {
                recordsMessage
            }), null, null, new List <Message> {
                rootMessage
            }, DateTime.MinValue);

            A.CallTo(() => _domainStatusEvaluator.GetStatus(A <List <Message> > .That.Matches(x => x.Contains(rootMessage) && x.Contains(recordsMessage) && x.Contains(recordsRecordsMessages)))).Returns(Status.Info);

            _domainStatusPublisher.Publish(message);

            Expression <Func <DomainStatusEvaluation, bool> > predicate = x =>
                                                                          x.Status == Status.Info &&
                                                                          x.RecordType == "SPF" &&
                                                                          x.Id == "testDomain";

            A.CallTo(() => _dispatcher.Dispatch(A <DomainStatusEvaluation> .That.Matches(predicate), "testSnsTopicArn")).MustHaveHappenedOnceExactly();
        }
        public void NullTermsDoesntErrorGetMessagesOut()
        {
            Message rootMessage    = CreateInfoMessage();
            Message recordsMessage = CreateInfoMessage();
            Message spfRecordWithIncludeMessage = CreateInfoMessage();

            SpfRecord spfRecordWithInclude = new SpfRecord(null, null, new List <Term> {
                null
            }, new List <Message> {
                spfRecordWithIncludeMessage
            }, false);

            SpfRecords rootSpfRecords = new SpfRecords(new List <SpfRecord> {
                spfRecordWithInclude
            }, 100, new List <Message> {
                recordsMessage
            });

            SpfRecordsEvaluated message = new SpfRecordsEvaluated("test.gov.uk", rootSpfRecords, null, null, new List <Message> {
                rootMessage
            }, DateTime.UtcNow);

            A.CallTo(() => _domainStatusEvaluator.GetStatus(A <List <Message> > .That.Matches(x => x.Contains(rootMessage) && x.Contains(recordsMessage) && x.Contains(spfRecordWithIncludeMessage)))).Returns(Status.Error);

            _domainStatusPublisher.Publish(message);

            Expression <Func <DomainStatusEvaluation, bool> > predicate = x =>
                                                                          x.Status == Status.Error &&
                                                                          x.RecordType == "SPF" &&
                                                                          x.Id == "test.gov.uk";

            A.CallTo(() => _dispatcher.Dispatch(A <DomainStatusEvaluation> .That.Matches(predicate), "testSnsTopicArn")).MustHaveHappenedOnceExactly();
        }