コード例 #1
0
        public void GetScrumTeam_ExpiredTeamInRepository_ThrowsException()
        {
            // Arrange
            var timeProvider  = new DateTimeProviderMock();
            var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict);

            configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15));

            timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc));
            var team   = new ScrumTeam("team", timeProvider);
            var master = team.SetScrumMaster("master");

            master.UpdateActivity();

            var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict);

            repository.Setup(r => r.LoadScrumTeam("team")).Returns(team);
            repository.Setup(r => r.DeleteScrumTeam("team"));

            timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 16, 0, DateTimeKind.Utc));
            var target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object);

            // Act
            target.GetScrumTeam("team");
        }
コード例 #2
0
        public void GetScrumTeam_TeamAlreadyLoaded_NotLoadingAgain()
        {
            // Arrange
            var timeProvider  = new DateTimeProviderMock();
            var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict);

            configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15));

            timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc));
            var team   = new ScrumTeam("team");
            var master = team.SetScrumMaster("master");

            master.UpdateActivity();

            var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict);

            repository.Setup(r => r.LoadScrumTeam("team")).Returns(team);

            timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 14, 0, DateTimeKind.Utc));
            var target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object);

            // Act
            using (target.GetScrumTeam("team"))
            {
            }

            using (var teamLock = target.GetScrumTeam("team"))
            {
                // Verify
                Assert.AreEqual <ScrumTeam>(team, teamLock.Team);
                repository.Verify(r => r.LoadScrumTeam("team"), Times.Once());
                repository.Verify(r => r.DeleteScrumTeam("team"), Times.Never());
            }
        }
コード例 #3
0
        public void DisconnectInactiveObservers_InactiveObserver_ObserverIsDisconnected()
        {
            // Arrange
            var dateTimeProvider = new DateTimeProviderMock();

            dateTimeProvider.SetUtcNow(new DateTime(2012, 1, 1, 3, 2, 20));

            var       target = CreatePlanningPokerController(dateTimeProvider: dateTimeProvider);
            ScrumTeam team;

            using (var teamLock = target.CreateScrumTeam("team", "master"))
            {
                team = teamLock.Team;
                team.Join("observer", true);
            }

            dateTimeProvider.SetUtcNow(new DateTime(2012, 1, 1, 3, 2, 55));
            team.ScrumMaster.UpdateActivity();

            // Act
            target.DisconnectInactiveObservers(TimeSpan.FromSeconds(30.0));

            // Verify
            using (var teamLock = target.GetScrumTeam("team"))
            {
                Assert.AreEqual <int>(0, teamLock.Team.Observers.Count());
            }
        }
コード例 #4
0
        public void CreateScrumTeam_ExpiredTeamInRepository_CreatesNewTeamAndDeletesOldOne()
        {
            // Arrange
            var timeProvider  = new DateTimeProviderMock();
            var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict);

            configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15));

            timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc));
            var availableEstimations = DeckProvider.Default.GetDefaultDeck();
            var team   = new ScrumTeam("team", availableEstimations, timeProvider, null);
            var master = team.SetScrumMaster("master");

            master.UpdateActivity();

            var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict);

            repository.Setup(r => r.LoadScrumTeam("team")).Returns(team);
            repository.Setup(r => r.DeleteScrumTeam("team"));

            timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 16, 0, DateTimeKind.Utc));
            var target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object);

            // Act
            using (var teamLock = target.CreateScrumTeam("team", "master", Deck.Standard))
            {
                // Verify
                Assert.AreNotEqual <ScrumTeam>(team, teamLock.Team);
                repository.Verify(r => r.LoadScrumTeam("team"), Times.Once());
                repository.Verify(r => r.DeleteScrumTeam("team"), Times.Once());
            }
        }
コード例 #5
0
        public void AttachScrumTeam_TeamInRepository_DoesNotCreateNewTeam()
        {
            // Arrange
            var timeProvider  = new DateTimeProviderMock();
            var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict);

            configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15));

            timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc));
            var team   = new ScrumTeam("team");
            var master = team.SetScrumMaster("master");

            master.UpdateActivity();

            var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict);

            repository.Setup(r => r.LoadScrumTeam("team")).Returns(team);

            timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 14, 0, DateTimeKind.Utc));
            var target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object);

            var inputTeam = new ScrumTeam("team");

            // Act
            Assert.ThrowsException <ArgumentException>(() => target.AttachScrumTeam(inputTeam));
        }
コード例 #6
0
        public void DisconnectInactiveObservers_NoInactiveMembers_TeamIsUnchanged()
        {
            // Arrange
            var dateTimeProvider = new DateTimeProviderMock();

            dateTimeProvider.SetUtcNow(new DateTime(2012, 1, 1, 3, 2, 20));

            var       target = new PlanningPokerController(dateTimeProvider, null, null);
            ScrumTeam team;

            using (var teamLock = target.CreateScrumTeam("team", "master"))
            {
                team = teamLock.Team;
                team.Join("member", false);
            }

            dateTimeProvider.SetUtcNow(new DateTime(2012, 1, 1, 3, 2, 40));
            team.ScrumMaster.UpdateActivity();

            // Act
            target.DisconnectInactiveObservers(TimeSpan.FromSeconds(30.0));

            // Verify
            using (var teamLock = target.GetScrumTeam("team"))
            {
                Assert.AreEqual <int>(2, teamLock.Team.Members.Count());
            }
        }
コード例 #7
0
        public void CreateScrumTeam_TeamInRepository_DoesNotDeleteOldTeam()
        {
            // Arrange
            var timeProvider  = new DateTimeProviderMock();
            var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict);

            configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15));

            timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc));
            var team   = new ScrumTeam("team");
            var master = team.SetScrumMaster("master");

            master.UpdateActivity();

            var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict);

            repository.Setup(r => r.LoadScrumTeam("team")).Returns(team);

            timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 14, 0, DateTimeKind.Utc));
            var target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object);

            // Act
            try
            {
                target.CreateScrumTeam("team", "master");
            }
            catch (ArgumentException)
            {
                // expected exception when adding same team
            }

            // Verify
            repository.Verify(r => r.LoadScrumTeam("team"), Times.Once());
            repository.Verify(r => r.DeleteScrumTeam("team"), Times.Never());
        }
コード例 #8
0
        public void GetScrumTeam_TeamCreatedWhileLoading_DoesNotCreateNewTeam()
        {
            // Arrange
            var timeProvider  = new DateTimeProviderMock();
            var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict);

            configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15));

            timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc));
            var team   = new ScrumTeam("team");
            var master = team.SetScrumMaster("master");

            master.UpdateActivity();

            bool firstLoad   = true;
            bool firstReturn = true;
            PlanningPokerController target = null;
            ScrumTeam createdTeam          = null;

            var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict);

            repository.Setup(r => r.LoadScrumTeam("team"))
            .Callback <string>(n =>
            {
                if (firstLoad)
                {
                    firstLoad = false;
                    using (var teamLock = target.CreateScrumTeam("team", "master"))
                    {
                        createdTeam = teamLock.Team;
                    }
                }
            }).Returns <string>(n =>
            {
                if (firstReturn)
                {
                    firstReturn = false;
                    return(null);
                }
                else
                {
                    return(team);
                }
            });

            target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object);

            // Act
            using (var teamLock = target.GetScrumTeam("team"))
            {
                // Verify
                Assert.AreNotEqual <ScrumTeam>(team, createdTeam);
                Assert.AreNotEqual <ScrumTeam>(team, teamLock.Team);
                Assert.AreEqual <ScrumTeam>(createdTeam, teamLock.Team);
                repository.Verify(r => r.LoadScrumTeam("team"), Times.Exactly(2));
                repository.Verify(r => r.DeleteScrumTeam("team"), Times.Never());
            }
        }
コード例 #9
0
        public void CreateScrumTeam_TeamCreatedWhileLoading_DoesNotCreateNewTeam()
        {
            // Arrange
            var timeProvider  = new DateTimeProviderMock();
            var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict);

            configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15));

            timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc));
            var team   = new ScrumTeam("team");
            var master = team.SetScrumMaster("master");

            master.UpdateActivity();

            bool firstLoad   = true;
            bool firstReturn = true;
            PlanningPokerController target = null;

            var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict);

            repository.Setup(r => r.LoadScrumTeam("team"))
            .Callback <string>(n =>
            {
                if (firstLoad)
                {
                    firstLoad = false;
                    try
                    {
                        using (var teamLock = target.CreateScrumTeam("team", "master", Deck.Standard))
                        {
                            Assert.AreNotEqual <ScrumTeam>(team, teamLock.Team);
                        }
                    }
                    catch (ArgumentException)
                    {
                        // if ArgumentException is here, test should fail
                    }
                }
            }).Returns <string>(n =>
            {
                if (firstReturn)
                {
                    firstReturn = false;
                    return(null);
                }
                else
                {
                    return(team);
                }
            });

            target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object);

            // Act
            Assert.ThrowsException <ArgumentException>(() => target.CreateScrumTeam("team", "master", Deck.Standard));
        }
コード例 #10
0
        public void PlanningPokerController_SpecificDateTimeProvider_DateTimeProviderIsSet()
        {
            // Arrange
            var dateTimeProvider = new DateTimeProviderMock();

            // Act
            var result = CreatePlanningPokerController(dateTimeProvider: dateTimeProvider);

            // Verify
            Assert.AreEqual <DateTimeProvider>(dateTimeProvider, result.DateTimeProvider);
        }
コード例 #11
0
        public async Task RunBeforeAnyTests()
        {
            // Create database container for integration tests
            var dockerSqlPort = await DockerDatabaseUtilities.EnsureDockerStartedAsync();

            var dockerConnectionString = DockerDatabaseUtilities.GetSqlConnectionString(dockerSqlPort);

            // Build configuration, including the connection string from the database container
            var builder = new ConfigurationBuilder()
                          .SetBasePath(Directory.GetCurrentDirectory())
                          .AddJsonFile("appsettings.json", false, true)
                          .AddInMemoryCollection(new Dictionary <string, string>
            {
                { "ConnectionStrings:Database", dockerConnectionString }
            })
                          .AddEnvironmentVariables();

            _configuration = builder.Build();
            _env           = Mock.Of <IWebHostEnvironment>();

            var startup  = new Startup(_configuration, _env);
            var services = new ServiceCollection();

            services.AddLogging();
            startup.ConfigureServices(services);

            #region Register mocks

            var descriptorCurrentUserService = services.FirstOrDefault(d => d.ServiceType == typeof(ICurrentUserService));
            services.Remove(descriptorCurrentUserService !);
            services.AddTransient(_ => CurrentUserServiceMock.Create(_user).Object);

            var descriptorDateTimeProvider = services.FirstOrDefault(d => d.ServiceType == typeof(IDateTimeProvider));
            services.Remove(descriptorDateTimeProvider !);
            services.AddTransient(_ => DateTimeProviderMock.Create(DateTime.UtcNow).Object);

            var descriptorStorageService = services.FirstOrDefault(d => d.ServiceType == typeof(IStorageService));
            services.Remove(descriptorStorageService !);
            services.AddTransient(_ => StorageServiceMock.Create().Object);

            #endregion

            _scopeFactory = services.BuildServiceProvider().GetService <IServiceScopeFactory>()
                            ?? throw new InvalidOperationException();

            _checkpoint = new Checkpoint
            {
                TablesToIgnore = new[] { "__EFMigrationsHistory" },
                DbAdapter      = DbAdapter.Postgres
            };

            EnsureDatabase();
        }
コード例 #12
0
        public void CreateScrumTeam_SpecificDateTimeProvider_CreatedTeamWithDateTimeProvider()
        {
            // Arrange
            var dateTimeProvider = new DateTimeProviderMock();
            var target           = CreatePlanningPokerController(dateTimeProvider: dateTimeProvider);

            // Act
            using (var teamLock = target.CreateScrumTeam("team", "master"))
            {
                // Verify
                Assert.AreEqual <DateTimeProvider>(dateTimeProvider, teamLock.Team.DateTimeProvider);
            }
        }
コード例 #13
0
        public void SerializeAndDeserialize_DateTimeProvider_DateTimeProviderIsSet()
        {
            // Arrange
            var team = new ScrumTeam("test");

            team.SetScrumMaster("master");
            var dateTimeProvider = new DateTimeProviderMock();

            // Act
            var json   = SerializeTeam(team);
            var result = DeserializeTeam(json, dateTimeProvider);

            // Verify
            Assert.AreEqual <DateTimeProvider>(dateTimeProvider, result.DateTimeProvider);
        }
コード例 #14
0
        private static BookingStatusRefreshService CreateBookingStatusRefreshService(IDistributedFlow flow, ISupplierBookingManagementService supplierService, List <Suppliers>?disabledSuppliers = null)
        {
            var context          = CreateContext();
            var dateTimeProvider = new DateTimeProviderMock(DateTimeNow);
            var monitor          = Mock.Of <IOptionsMonitor <BookingStatusUpdateOptions> >(_ => _.CurrentValue == new BookingStatusUpdateOptions
            {
                DisabledSuppliers = disabledSuppliers ?? new List <Suppliers>()
            });

            return(new BookingStatusRefreshService(
                       flow,
                       dateTimeProvider,
                       supplierService,
                       context,
                       monitor
                       ));
        }
コード例 #15
0
        public void TotalDays_CalculatedValue_ReturnsTermTotalDays()
        {
            // Arrange
            var termConfigurationMock = new Mock <IOptions <TermConfiguration> >();

            termConfigurationMock.Setup(x => x.Value).Returns(CreateTermConfiguration());

            var dateTimeProvider = new DateTimeProviderMock();

            var term = new Term(dateTimeProvider.Object, termConfigurationMock.Object);

            // Act
            var result = term.TotalDays;

            // Assert
            Assert.IsType <int>(result);
            Assert.Equal(1461, result);
        }
コード例 #16
0
        public void EndingDate_CalculatedValue_ReturnsTermEndingDate()
        {
            // Arrange
            var termConfigurationMock = new Mock <IOptions <TermConfiguration> >();

            termConfigurationMock.Setup(x => x.Value).Returns(CreateTermConfiguration());

            var dateTimeProvider = new DateTimeProviderMock();

            var term = new Term(dateTimeProvider.Object, termConfigurationMock.Object);

            // Act
            var result = term.EndingDate;

            // Assert
            Assert.IsType <DateTime>(result);
            Assert.Equal(new DateTime(2023, 12, 10), result);
        }
コード例 #17
0
        public void Progress_MidnightAfterLastTermDay_ReturnsCompletedProgress()
        {
            // Arrange
            var termConfigurationMock = new Mock <IOptions <TermConfiguration> >();

            termConfigurationMock.Setup(x => x.Value).Returns(CreateTermConfiguration());

            var dateTimeProvider = new DateTimeProviderMock()
                                   .MockNow(new DateTime(2023, 12, 10));

            var term = new Term(dateTimeProvider.Object, termConfigurationMock.Object);

            // Act
            var result = term.Progress;

            // Assert
            Assert.IsType <double>(result);
            Assert.Equal(1, result);
        }
コード例 #18
0
        public void Progress_MidnightAfterFirstTermDay_ReturnsOneDayProgress()
        {
            // Arrange
            var termConfigurationMock = new Mock <IOptions <TermConfiguration> >();

            termConfigurationMock.Setup(x => x.Value).Returns(CreateTermConfiguration());

            var dateTimeProvider = new DateTimeProviderMock()
                                   .MockNow(new DateTime(2019, 12, 11));

            var term = new Term(dateTimeProvider.Object, termConfigurationMock.Object);

            // Act
            var result = term.Progress;

            // Assert
            Assert.IsType <double>(result);
            Assert.Equal(0.0006844626967830253, result);
        }
コード例 #19
0
        public void RemainingDays_MidnightAfterFirstTermDay_ReturnsTotalDaysMinusOne()
        {
            // Arrange
            var termConfigurationMock = new Mock <IOptions <TermConfiguration> >();

            termConfigurationMock.Setup(x => x.Value).Returns(CreateTermConfiguration());

            var dateTimeProvider = new DateTimeProviderMock()
                                   .MockNow(new DateTime(2019, 12, 11));

            var term = new Term(dateTimeProvider.Object, termConfigurationMock.Object);

            // Act
            var result = term.RemainingDays;

            // Assert
            Assert.IsType <int>(result);
            Assert.Equal(1460, result);
        }
コード例 #20
0
        public void ElapsedDays_MidnightAfterLastTermDay_ReturnsSameElapsedDaysAsPeriodTotalDays()
        {
            // Arrange
            var termConfigurationMock = new Mock <IOptions <TermConfiguration> >();

            termConfigurationMock.Setup(x => x.Value).Returns(CreateTermConfiguration());

            var dateTimeProvider = new DateTimeProviderMock()
                                   .MockNow(new DateTime(2023, 12, 10));

            var term = new Term(dateTimeProvider.Object, termConfigurationMock.Object);

            // Act
            var result = term.ElapsedDays;

            // Assert
            Assert.IsType <int>(result);
            Assert.Equal(1461, result);
        }
コード例 #21
0
        public void DisconnectInactiveObservers_InactiveScrumMaster_TeamIsClosed()
        {
            // Arrange
            var dateTimeProvider = new DateTimeProviderMock();

            dateTimeProvider.SetUtcNow(new DateTime(2012, 1, 1, 3, 2, 20));

            var       target = CreatePlanningPokerController(dateTimeProvider: dateTimeProvider);
            ScrumTeam team;

            using (var teamLock = target.CreateScrumTeam("team", "master"))
            {
                team = teamLock.Team;
            }

            dateTimeProvider.SetUtcNow(new DateTime(2012, 1, 1, 3, 2, 55));

            // Act
            target.DisconnectInactiveObservers(TimeSpan.FromSeconds(30.0));

            // Verify
            target.GetScrumTeam("team");
        }
コード例 #22
0
        public void GetScrumTeam_DisconnectAfterwards_TeamIsRemovedFromRepository()
        {
            // Arrange
            var timeProvider  = new DateTimeProviderMock();
            var configuration = new Mock <IPlanningPokerConfiguration>(MockBehavior.Strict);

            configuration.SetupGet(c => c.ClientInactivityTimeout).Returns(TimeSpan.FromMinutes(15));

            timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 0, 0, DateTimeKind.Utc));
            var team   = new ScrumTeam("team");
            var master = team.SetScrumMaster("master");

            master.UpdateActivity();

            var repository = new Mock <IScrumTeamRepository>(MockBehavior.Strict);

            repository.Setup(r => r.LoadScrumTeam("team")).Returns(team);
            repository.Setup(r => r.DeleteScrumTeam("team"));
            repository.SetupGet(r => r.ScrumTeamNames).Returns(Enumerable.Empty <string>());

            timeProvider.SetUtcNow(new DateTime(2015, 1, 1, 10, 14, 0, DateTimeKind.Utc));
            var target = CreatePlanningPokerController(timeProvider, configuration.Object, repository.Object);

            // Act
            using (var teamLock = target.GetScrumTeam("team"))
            {
                teamLock.Team.Disconnect(master.Name);
                var result = target.ScrumTeamNames;

                // Verify
                Assert.AreEqual <ScrumTeam>(team, teamLock.Team);
                Assert.IsFalse(result.Any());
                repository.Verify(r => r.LoadScrumTeam("team"), Times.Once());
                repository.Verify(r => r.DeleteScrumTeam("team"), Times.Once());
            }
        }
コード例 #23
0
 public DateTimeProviderMockSteps(DateTimeProviderMock dateTimeProviderMock)
 {
     _dateTimeProviderMock = dateTimeProviderMock;
 }