public static User CreateBasicUser(UserId gpid, string emailAddress, int metroId)
        {
            // do any business logic to protect invariants
            // note: validation, like email address is well formed, is not something that should be done in here -
            // that should be taken care of before this method is invoked
            var user = Factory();

            user.ApplyChange(UserEvents.Created(emailAddress, gpid, metroId, false));
            return(user);
        }
        public void DisableUser()
        {
            var id      = new UserId(Guid.NewGuid());
            var email   = "*****@*****.**";
            var metroId = 11;

            new CommandScenarioFor <User>(User.Factory)
            .Given(UserEvents.Created(email, id, metroId, false))
            .When(user => user.Disable())
            .Then(UserEvents.Disabled(id))
            .Assert();
        }
        public void CreatingNewUser()
        {
            var id      = new UserId(Guid.NewGuid());
            var email   = "*****@*****.**";
            var metroId = 11;
            var command = new CreateBasicUser {
                EmailAddress = email, GlobalPersonId = id.Gpid, MetroId = metroId
            };

            new ConstructorScenarioFor <User>(() => User.CreateBasicUser(id, email, metroId)).
            Then(UserEvents.Created(email, id, metroId, false)).
            Assert();
        }
        public void AddWishListItemToUser()
        {
            var id             = new UserId(Guid.NewGuid());
            var email          = "*****@*****.**";
            var metroId        = 11;
            var wishlistItemId = new WishListItemId(Guid.NewGuid());
            var restoId        = new RestaurantId(Guid.NewGuid());

            new CommandScenarioFor <User>(User.Factory)
            .Given(UserEvents.Created(email, id, metroId, false))
            .When(user => user.AddWishListItem(id, wishlistItemId, restoId, "some notes"))
            .Then(UserEvents.WishListItemAdded(id, wishlistItemId, restoId, "some notes"))
            .Assert();
        }
        public void AddFriendsToUser()
        {
            var id       = new UserId(Guid.NewGuid());
            var friendId = new UserId(Guid.NewGuid());
            var email    = "*****@*****.**";
            var metroId  = 11;
            var fname    = "John";
            var lname    = "Jack";
            var command  = new AddFriendToUser(id, friendId, fname, lname, null, null, null);

            new CommandScenarioFor <User>(User.Factory)
            .Given(UserEvents.Created(email, id, metroId, false))
            .When(user => user.AddFriend(new UserId(command.Gpid), new UserId(command.FriendsGpid), command.FName, command.LName))
            .Then(UserEvents.NewFriend(id, friendId, fname, lname))
            .Assert();
        }
        public void AlreadyDisabledUserThrows()
        {
            // this test may be mute; disabling an already disabled user may be
            // the result of some eventual consistency, and ignoring a second command
            // to disable would make the operation idempotent
            var id      = new UserId(Guid.NewGuid());
            var email   = "*****@*****.**";
            var metroId = 11;

            new CommandScenarioFor <User>(User.Factory)
            .Given(UserEvents.Created(email, id, metroId, false))
            .Given(UserEvents.Disabled(id))
            .When(user => user.Disable())
            .Throws(new AggregateException(string.Format("User {0} is already disabled", id)))
            .Assert();
        }