public void Constructor2HappyPath()
        {
            var source = new SequentialEvent
            {
                Sequence        = "1",
                SequenceType    = SequenceTypes.Integer,
                Id              = "MyId",
                Time            = new DateTime(2020, 7, 9, 22, 21, 37, DateTimeKind.Local),
                Source          = "http://mysource/",
                Type            = "MyType",
                DataContentType = "application/json; charset=utf-8",
                DataSchema      = "http://mydataschema/",
                Subject         = "MySubject"
            };

            var cloudEvent = new SequentialEvent(source);

            cloudEvent.Sequence.Should().Be("2");
            cloudEvent.SequenceType.Should().Be(SequenceTypes.Integer);

            cloudEvent.Source.Should().BeSameAs(source.Source);
            cloudEvent.Type.Should().BeSameAs(source.Type);
            cloudEvent.DataContentType.Should().BeSameAs(source.DataContentType);
            cloudEvent.DataSchema.Should().BeSameAs(source.DataSchema);
            cloudEvent.Subject.Should().BeSameAs(source.Subject);

            cloudEvent.Id.Should().NotBe(source.Id);
            cloudEvent.Time.Should().NotBe(source.Time);
        }
        public void SequenceTypePropertyHappyPath()
        {
            var cloudEvent = new SequentialEvent();

            cloudEvent.SequenceType = "abc";

            cloudEvent.SequenceType.Should().Be("abc");
        }
        public void SequencePropertyHappyPath()
        {
            var cloudEvent = new SequentialEvent();

            cloudEvent.Sequence = "123";

            cloudEvent.Sequence.Should().Be("123");
        }
        public void ValidateMethodSadPath1(string sequence)
        {
            var cloudEvent = new SequentialEvent
            {
                Type     = "MyType",
                Source   = "/MySource",
                Sequence = sequence
            };

            cloudEvent.Invoking(ce => ce.Validate())
            .Should().ThrowExactly <CloudEventValidationException>()
            .WithMessage("Sequence cannot be null or empty.");
        }
        public void ValidateMethodHappyPath()
        {
            var cloudEvent = new SequentialEvent
            {
                Type         = "MyType",
                Source       = "/MySource",
                Sequence     = "1",
                SequenceType = SequenceTypes.Integer
            };

            cloudEvent.Invoking(ce => ce.Validate())
            .Should().NotThrow();
        }
        public void ValidateMethodSadPath2()
        {
            var cloudEvent = new SequentialEvent
            {
                Type         = "MyType",
                Source       = "/MySource",
                Sequence     = "abc",
                SequenceType = SequenceTypes.Integer
            };

            cloudEvent.Invoking(ce => ce.Validate())
            .Should().ThrowExactly <CloudEventValidationException>()
            .WithMessage("Invalid valid for Sequence: 'abc'.*");
        }
        public void ValidateStaticMethodSadPath1()
        {
            // Missing Sequence

            var senderMessage = new SenderMessage("Hello, world!");

            senderMessage.Headers.Add(CloudEvent.IdAttribute, "MyId");
            senderMessage.Headers.Add(CloudEvent.SourceAttribute, new Uri("http://MySource"));
            senderMessage.Headers.Add(CloudEvent.TypeAttribute, "MyType");
            senderMessage.Headers.Add(CloudEvent.TimeAttribute, DateTime.UtcNow);

            Action act = () => SequentialEvent.Validate(senderMessage);

            act.Should().ThrowExactly <CloudEventValidationException>();
        }
        public void ValidateStaticMethodHappyPath1()
        {
            var senderMessage = new SenderMessage("Hello, world!");

            senderMessage.Headers.Add(SequentialEvent.SequenceAttribute, "1");

            senderMessage.Headers.Add(CloudEvent.SpecVersionAttribute, "1.0");
            senderMessage.Headers.Add(CloudEvent.IdAttribute, "MyId");
            senderMessage.Headers.Add(CloudEvent.SourceAttribute, new Uri("http://MySource"));
            senderMessage.Headers.Add(CloudEvent.TypeAttribute, "MyType");
            senderMessage.Headers.Add(CloudEvent.TimeAttribute, DateTime.UtcNow);

            Action act = () => SequentialEvent.Validate(senderMessage);

            act.Should().NotThrow();
        }
        public void ValidateStaticMethodHappyPath2()
        {
            // Non-default protocol binding

            var senderMessage = new SenderMessage("Hello, world!");

            senderMessage.Headers.Add("test-" + SequentialEvent.SequenceAttribute, "1");

            senderMessage.Headers.Add("test-" + CloudEvent.SpecVersionAttribute, "1.0");
            senderMessage.Headers.Add("test-" + CloudEvent.IdAttribute, "MyId");
            senderMessage.Headers.Add("test-" + CloudEvent.SourceAttribute, new Uri("http://MySource"));
            senderMessage.Headers.Add("test-" + CloudEvent.TypeAttribute, "MyType");
            senderMessage.Headers.Add("test-" + CloudEvent.TimeAttribute, DateTime.UtcNow);

            var mockProtocolBinding = new Mock <IProtocolBinding>();

            mockProtocolBinding.Setup(m => m.GetHeaderName(It.IsAny <string>())).Returns <string>(header => "test-" + header);

            Action act = () => SequentialEvent.Validate(senderMessage, mockProtocolBinding.Object);

            act.Should().NotThrow();
        }
        private static IEnumerator ElementShowingCoroutine(SequentialEvent sequentialEvent)
        {
            yield return(new WaitForSecondsRealtime(sequentialEvent.timeToTrigger));

            sequentialEvent.eventToTrigger?.Invoke();
        }