public void AddUsersToCompleteAnExistingSkirmishGameTest()
        {
            var maxNumberOfPlayersPerGame = 3;
            var startingDateTime = DateTime.Parse("01/01/2001 00:00:00");
            var testUserId1 = Guid.NewGuid().ToString();
            var testUserId2 = Guid.NewGuid().ToString();
            var testUserId3 = Guid.NewGuid().ToString();
            var testGameQueue = new GameQueue
            {
                Id = Guid.NewGuid(),
                Users = new List<GameUser> { new GameUser { UserId = testUserId1 } },
                Status = QueueStatus.Waiting,
                CreationTime = startingDateTime
            };

            var workerContext = new Mock<IWorkerContext>();
            var testContext = new ConcurrentDictionary<string, object>();
            testContext.GetOrAdd("currentGameQueueId", testGameQueue.Id);
            workerContext.SetupGet(p => p.Context).Returns(testContext);

            var gameRepository = new Mock<IGameRepository>();
            gameRepository.Setup(m => m.GetGameQueue(It.Is<Guid>(g => g == testGameQueue.Id)))
                          .Returns(testGameQueue)
                          .Verifiable();

            gameRepository.Setup(m => m.AddOrUpdateGameQueue(It.Is<GameQueue>(g => g.Id == testGameQueue.Id && g.Status == QueueStatus.Waiting && g.Users.Count == 2 && g.Users.First().UserId == testUserId1 && g.Users.Last().UserId == testUserId2)))
                          .Verifiable();

            gameRepository.Setup(m => m.AddOrUpdateGameQueue(It.Is<GameQueue>(g => g.Id == testGameQueue.Id && g.Status == QueueStatus.Ready && g.Users.Count == 3 && g.Users.ElementAt(0).UserId == testUserId1 && g.Users.ElementAt(1).UserId == testUserId2 && g.Users.ElementAt(2).UserId == testUserId3)))
                          .Verifiable();

            var userRepository = new Mock<IUserRepository>();
            userRepository.Setup(m => m.GetUser(It.Is<string>(u => u == testUserId2)))
                          .Returns(new UserProfile { Id = testUserId2 })
                          .Verifiable();
            userRepository.Setup(m => m.GetUser(It.Is<string>(u => u == testUserId3)))
                          .Returns(new UserProfile { Id = testUserId3 })
                          .Verifiable();
            userRepository.Setup(m => m.AddOrUpdateUserSession(It.Is<UserSession>(s => s.UserId == testUserId2 && s.ActiveGameQueueId == testGameQueue.Id)))
                          .Verifiable();

            var command = new SkirmishGameQueueCommand(userRepository.Object, gameRepository.Object, workerContext.Object, maxNumberOfPlayersPerGame, TimeSpan.FromSeconds(60));
            var context = new Dictionary<string, object>
            {
                { "userId", testUserId2 }
            };

            command.Do(context);

            context["userId"] = testUserId3;
            command.Do(context);

            gameRepository.VerifyAll();
            userRepository.VerifyAll();
        }
        public void AddUserToNewSkirmishGameWhenCurrentGameIsReadyTest()
        {
            var startingDateTime = DateTime.Parse("01/01/2001 00:00:00");
            var testUserId       = Guid.NewGuid().ToString();
            var testGameId2      = Guid.Empty;
            var testGameQueue1   = new GameQueue
            {
                Id    = Guid.NewGuid(),
                Users = new List <GameUser> {
                    new GameUser {
                        UserId = testUserId
                    }
                },
                Status       = QueueStatus.Ready,
                CreationTime = startingDateTime
            };

            var workerContext = new Mock <IWorkerContext>();
            var testContext   = new ConcurrentDictionary <string, object>();

            testContext.GetOrAdd("currentGameQueueId", testGameQueue1.Id);
            workerContext.SetupGet(p => p.Context).Returns(testContext);

            var gameRepository = new Mock <IGameRepository>();

            gameRepository.Setup(m => m.GetGameQueue(It.Is <Guid>(g => g == testGameQueue1.Id)))
            .Returns(testGameQueue1)
            .Verifiable();

            gameRepository.Setup(m => m.AddOrUpdateGameQueue(It.Is <GameQueue>(g => g.Id != Guid.Empty && g.Id != testGameQueue1.Id && g.Status == QueueStatus.Waiting && g.Users.Count == 1 && g.Users.First().UserId == testUserId)))
            .Callback(() => { testGameId2 = new Guid(workerContext.Object.Context["currentGameQueueId"].ToString()); })
            .Verifiable();

            var userRepository = new Mock <IUserRepository>();

            userRepository.Setup(m => m.GetUser(It.Is <string>(u => u == testUserId)))
            .Returns(new UserProfile {
                Id = testUserId
            })
            .Verifiable();
            userRepository.Setup(m => m.AddOrUpdateUserSession(It.Is <UserSession>(s => s.UserId == testUserId && s.ActiveGameQueueId == testGameId2)))
            .Verifiable();

            var command = new SkirmishGameQueueCommand(userRepository.Object, gameRepository.Object, workerContext.Object);
            var context = new Dictionary <string, object>
            {
                { "userId", testUserId }
            };

            command.Do(context);

            gameRepository.VerifyAll();
            userRepository.VerifyAll();
        }
        public void ShouldCurrentGameIdBeEmptyIfNotInContext()
        {
            // Arrange: We create the mock dependencies and the new command
            //          We make sure the currentGame doesn't exist in the context
            var    userRepository = new Mock <IUserRepository>();
            var    gameRepository = new Mock <IGameRepository>();
            var    workerContext  = CreateMockWorkerContext();
            var    command        = new SkirmishGameQueueCommand(userRepository.Object, gameRepository.Object, workerContext.Object);
            object value;

            workerContext.Object.Context.TryRemove("currentGameQueueId", out value);

            // Act: We ask for the CurrentGameId
            var currentGameId = command.CurrentGameQueueId;

            // Assert: We verify the CurrentGameId is empty
            Assert.AreEqual(Guid.Empty, currentGameId);
        }
        public void AddUserToNewSkirmishGameTest()
        {
            var testUserId = Guid.NewGuid().ToString();
            var gameId     = Guid.Empty;

            var workerContext = new Mock <IWorkerContext>();

            workerContext.SetupGet(p => p.Context).Returns(new ConcurrentDictionary <string, object>());

            var gameRepository = new Mock <IGameRepository>();

            gameRepository.Setup(m => m.GetGameQueue(It.Is <Guid>(g => g == Guid.Empty)))
            .Verifiable();

            gameRepository.Setup(m => m.AddOrUpdateGameQueue(It.Is <GameQueue>(g => g.Id != Guid.Empty && g.Status == QueueStatus.Waiting && g.Users.Count == 1 && g.Users.First().UserId == testUserId)))
            .Callback(() => { gameId = new Guid(workerContext.Object.Context["currentGameQueueId"].ToString()); })
            .Verifiable();

            var userRepository = new Mock <IUserRepository>();

            userRepository.Setup(m => m.GetUser(It.Is <string>(u => u == testUserId)))
            .Returns(new UserProfile {
                Id = testUserId
            })
            .Verifiable();
            userRepository.Setup(m => m.AddOrUpdateUserSession(It.Is <UserSession>(s => s.UserId == testUserId && s.ActiveGameQueueId == gameId)))
            .Verifiable();

            var command = new SkirmishGameQueueCommand(userRepository.Object, gameRepository.Object, workerContext.Object);
            var context = new Dictionary <string, object>
            {
                { "userId", testUserId }
            };

            command.Do(context);

            gameRepository.VerifyAll();
            userRepository.VerifyAll();
        }
        public void AddUsersToCompleteAnExistingSkirmishGameTest()
        {
            var maxNumberOfPlayersPerGame = 3;
            var startingDateTime          = DateTime.Parse("01/01/2001 00:00:00");
            var testUserId1   = Guid.NewGuid().ToString();
            var testUserId2   = Guid.NewGuid().ToString();
            var testUserId3   = Guid.NewGuid().ToString();
            var testGameQueue = new GameQueue
            {
                Id    = Guid.NewGuid(),
                Users = new List <GameUser> {
                    new GameUser {
                        UserId = testUserId1
                    }
                },
                Status       = QueueStatus.Waiting,
                CreationTime = startingDateTime
            };

            var workerContext = new Mock <IWorkerContext>();
            var testContext   = new ConcurrentDictionary <string, object>();

            testContext.GetOrAdd("currentGameQueueId", testGameQueue.Id);
            workerContext.SetupGet(p => p.Context).Returns(testContext);

            var gameRepository = new Mock <IGameRepository>();

            gameRepository.Setup(m => m.GetGameQueue(It.Is <Guid>(g => g == testGameQueue.Id)))
            .Returns(testGameQueue)
            .Verifiable();

            gameRepository.Setup(m => m.AddOrUpdateGameQueue(It.Is <GameQueue>(g => g.Id == testGameQueue.Id && g.Status == QueueStatus.Waiting && g.Users.Count == 2 && g.Users.First().UserId == testUserId1 && g.Users.Last().UserId == testUserId2)))
            .Verifiable();

            gameRepository.Setup(m => m.AddOrUpdateGameQueue(It.Is <GameQueue>(g => g.Id == testGameQueue.Id && g.Status == QueueStatus.Ready && g.Users.Count == 3 && g.Users.ElementAt(0).UserId == testUserId1 && g.Users.ElementAt(1).UserId == testUserId2 && g.Users.ElementAt(2).UserId == testUserId3)))
            .Verifiable();

            var userRepository = new Mock <IUserRepository>();

            userRepository.Setup(m => m.GetUser(It.Is <string>(u => u == testUserId2)))
            .Returns(new UserProfile {
                Id = testUserId2
            })
            .Verifiable();
            userRepository.Setup(m => m.GetUser(It.Is <string>(u => u == testUserId3)))
            .Returns(new UserProfile {
                Id = testUserId3
            })
            .Verifiable();
            userRepository.Setup(m => m.AddOrUpdateUserSession(It.Is <UserSession>(s => s.UserId == testUserId2 && s.ActiveGameQueueId == testGameQueue.Id)))
            .Verifiable();

            var command = new SkirmishGameQueueCommand(userRepository.Object, gameRepository.Object, workerContext.Object, maxNumberOfPlayersPerGame, TimeSpan.FromSeconds(60));
            var context = new Dictionary <string, object>
            {
                { "userId", testUserId2 }
            };

            command.Do(context);

            context["userId"] = testUserId3;
            command.Do(context);

            gameRepository.VerifyAll();
            userRepository.VerifyAll();
        }
        public void ShouldCurrentGameIdBeEmptyIfNotInContext()
        {
            // Arrange: We create the mock dependencies and the new command
            //          We make sure the currentGame doesn't exist in the context
            var userRepository = new Mock<IUserRepository>();
            var gameRepository = new Mock<IGameRepository>();
            var workerContext = CreateMockWorkerContext();
            var command = new SkirmishGameQueueCommand(userRepository.Object, gameRepository.Object, workerContext.Object);
            object value;
            workerContext.Object.Context.TryRemove("currentGameQueueId", out value);

            // Act: We ask for the CurrentGameId
            var currentGameId = command.CurrentGameQueueId;

            // Assert: We verify the CurrentGameId is empty
            Assert.AreEqual(Guid.Empty, currentGameId);
        }
        public void AddUserToNewSkirmishGameWhenCurrentGameIsReadyTest()
        {
            var startingDateTime = DateTime.Parse("01/01/2001 00:00:00");
            var testUserId = Guid.NewGuid().ToString();
            var testGameId2 = Guid.Empty;
            var testGameQueue1 = new GameQueue
            {
                Id = Guid.NewGuid(),
                Users = new List<GameUser> { new GameUser { UserId = testUserId } },
                Status = QueueStatus.Ready,
                CreationTime = startingDateTime
            };

            var workerContext = new Mock<IWorkerContext>();
            var testContext = new ConcurrentDictionary<string, object>();
            testContext.GetOrAdd("currentGameQueueId", testGameQueue1.Id);
            workerContext.SetupGet(p => p.Context).Returns(testContext);

            var gameRepository = new Mock<IGameRepository>();
            gameRepository.Setup(m => m.GetGameQueue(It.Is<Guid>(g => g == testGameQueue1.Id)))
                          .Returns(testGameQueue1)
                          .Verifiable();

            gameRepository.Setup(m => m.AddOrUpdateGameQueue(It.Is<GameQueue>(g => g.Id != Guid.Empty && g.Id != testGameQueue1.Id && g.Status == QueueStatus.Waiting && g.Users.Count == 1 && g.Users.First().UserId == testUserId)))
                          .Callback(() => { testGameId2 = new Guid(workerContext.Object.Context["currentGameQueueId"].ToString()); })
                          .Verifiable();

            var userRepository = new Mock<IUserRepository>();
            userRepository.Setup(m => m.GetUser(It.Is<string>(u => u == testUserId)))
                          .Returns(new UserProfile { Id = testUserId })
                          .Verifiable();
            userRepository.Setup(m => m.AddOrUpdateUserSession(It.Is<UserSession>(s => s.UserId == testUserId && s.ActiveGameQueueId == testGameId2)))
                          .Verifiable();

            var command = new SkirmishGameQueueCommand(userRepository.Object, gameRepository.Object, workerContext.Object);
            var context = new Dictionary<string, object>
            {
                { "userId", testUserId }
            };

            command.Do(context);

            gameRepository.VerifyAll();
            userRepository.VerifyAll();
        }
        public void AddUserToNewSkirmishGameTest()
        {
            var testUserId = Guid.NewGuid().ToString();
            var gameId = Guid.Empty;

            var workerContext = new Mock<IWorkerContext>();
            workerContext.SetupGet(p => p.Context).Returns(new ConcurrentDictionary<string, object>());

            var gameRepository = new Mock<IGameRepository>();
            gameRepository.Setup(m => m.GetGameQueue(It.Is<Guid>(g => g == Guid.Empty)))
                          .Verifiable();

            gameRepository.Setup(m => m.AddOrUpdateGameQueue(It.Is<GameQueue>(g => g.Id != Guid.Empty && g.Status == QueueStatus.Waiting && g.Users.Count == 1 && g.Users.First().UserId == testUserId)))
                          .Callback(() => { gameId = new Guid(workerContext.Object.Context["currentGameQueueId"].ToString()); })
                          .Verifiable();

            var userRepository = new Mock<IUserRepository>();
            userRepository.Setup(m => m.GetUser(It.Is<string>(u => u == testUserId)))
                          .Returns(new UserProfile { Id = testUserId })
                          .Verifiable();
            userRepository.Setup(m => m.AddOrUpdateUserSession(It.Is<UserSession>(s => s.UserId == testUserId && s.ActiveGameQueueId == gameId)))
                          .Verifiable();

            var command = new SkirmishGameQueueCommand(userRepository.Object, gameRepository.Object, workerContext.Object);
            var context = new Dictionary<string, object>
            {
                { "userId", testUserId }
            };

            command.Do(context);

            gameRepository.VerifyAll();
            userRepository.VerifyAll();
        }