public async Task After_submission__handler_returns_school_Id()
        {
            var command = new RegisterSchool.Command()
            {
                Name        = "I Liceum Ogólnokształcące",
                City        = "Gdańsk",
                Address     = "Wały Piastowskie 6",
                ContactData = new[] {
                    new ContactData()
                    {
                        Name         = "sekretariat",
                        EmailAddress = EmailAddress.Parse("*****@*****.**"),
                        PhoneNumber  = PhoneNumber.Parse("58 301-67-34")
                    },
                }
            };

            var sp = new ServiceProviderBuilder().BuildServiceProvider();

            using (var scope = sp.CreateScope())
            {
                var aggregateStore = scope.ServiceProvider.GetRequiredService <IAggregateStore>();
                var userAccessor   = Mock.Of <IUserAccessor>(
                    mock => mock.GetUser() == Task.FromResult(new ApplicationUser()
                {
                    Id = Guid.NewGuid()
                }),
                    MockBehavior.Strict);
                var handler = new RegisterSchoolHandler(NodaTime.SystemClock.Instance, userAccessor, aggregateStore);
                var result  = await handler.Handle(command, CancellationToken.None);

                Assert.True(result.IsSuccess);
                Assert.IsType <Guid>(result.Value);
            }
        }
        public void After_submission__aggregate_contains_SchoolRegistered_event()
        {
            var command = new RegisterSchool.Command()
            {
                Name        = "I Liceum Ogólnokształcące",
                City        = "Gdańsk",
                Address     = "Wały Piastowskie 6",
                ContactData = new[] {
                    new ContactData()
                    {
                        Name         = "sekretariat",
                        EmailAddress = EmailAddress.Parse("*****@*****.**"),
                        PhoneNumber  = PhoneNumber.Parse("58 301-67-34")
                    },
                }
            };

            var school          = new SchoolAggregate(SchoolId.New);
            var registeringUser = new ApplicationUser()
            {
                Id = Guid.NewGuid()
            };
            var result = school.RegisterSchool(NodaTime.SystemClock.Instance.GetCurrentInstant(), command, registeringUser);

            Assert.True(result.IsSuccess);
            var uncommittedEvent = Assert.Single(school.UncommittedEvents, e => e.AggregateEvent is SchoolRegistered);
            var @event           = Assert.IsType <SchoolRegistered>(uncommittedEvent.AggregateEvent);

            Assert.Equal(registeringUser.Id, @event.RegisteringUserId);
            Assert.Equal(command.Name, @event.Name);
            Assert.Equal(command.City, @event.City);
            var contactData = Assert.Single(command.ContactData);

            Assert.Equal("sekretariat", contactData.Name);
            Assert.Equal(EmailAddress.Parse("*****@*****.**"), contactData.EmailAddress);
            Assert.Equal(PhoneNumber.Parse("58 301-67-34"), contactData.PhoneNumber);
        }
        public async Task <IActionResult> Register(RegisterSchool.Command command)
        {
            var result = await _engine.Execute(command);

            return(result.MatchToActionResult(success => Ok(success)));
        }