public async Task CalculateWordsPerSession()
        {
            // Arrange
            var handler = new Service.Handlers.SubmitWordsHandler(_context, _mapper);
            var message = new SubmitWords
            {
                SessionId = _existingSession.Id,
                Words     = new List <string>
                {
                    "chocolate",
                    "vanilla",
                },
                DateModified = DateTime.UtcNow
            };
            await handler.Handle(message, new TestsMessageHandlerContext());

            // Act
            await new Worker.Handlers.RefreshCalculationsHandler(Common.GetDbContext(_connectionString), Common.GetMapper())
            .Handle(new RefreshCalculations(), new TestsMessageHandlerContext());

            // Assert
            _context = Common.GetDbContext(_connectionString);
            var vanillaCounts = await _context.SessionWordCounts.SingleAsync(s => s.Word == "vanilla");

            var chocolateCounts = await _context.SessionWordCounts.SingleAsync(s => s.Word == "chocolate");

            Assert.Equal(2, vanillaCounts.Count);
            Assert.Equal(1, chocolateCounts.Count);
        }
        public async Task <IActionResult> SubmitWords(Guid id, [FromBody] List <string> words)
        {
            if (!words.Any())
            {
                return(BadRequest(new { Detail = "Cannot submit empty list of words" }));
            }

            var session = await this._countingStringsRepository.GetByIdAsync(id);

            if (session == null)
            {
                return(BadRequest(new { Detail = "Session not recognized" }));
            }

            if (session.Status == 0)
            {
                return(BadRequest(new { Detail = "Session is already closed" }));
            }

            var submitWordsCommand = new SubmitWords
            {
                SessionId    = session.Id,
                Words        = words,
                DateModified = DateTime.UtcNow
            };

            await this._messageSession.Send(submitWordsCommand);

            return(NoContent());
        }
        public async Task CalculateWordFrequency()
        {
            // Arrange
            var handler = new Service.Handlers.SubmitWordsHandler(Common.GetDbContext(_connectionString), Common.GetMapper());
            var worker  =
                new Worker.Handlers.RefreshCalculationsHandler(Common.GetDbContext(_connectionString),
                                                               Common.GetMapper());

            var messageOld = new SubmitWords
            {
                SessionId = _existingSession.Id,
                Words     = new List <string>
                {
                    "chocolate",    // new
                    "vanilla",      // existing
                },
                DateModified = DateTime.UtcNow
            };

            await handler.Handle(messageOld, new TestsMessageHandlerContext());

            // Act
            await worker.Handle(new RefreshCalculations(), new TestsMessageHandlerContext());

            //Assert
            var refreshedContext = Common.GetDbContext(_connectionString);
            var vanillaData      = await refreshedContext.WordDateCounts.Where(s => s.Word == "vanilla").ToListAsync();

            var chocolateData = await _context.WordDateCounts.Where(s => s.Word == "chocolate").ToListAsync();

            Assert.True(vanillaData.Count == 2);
            Assert.Contains(vanillaData, d => d.Date.Date == DateTime.UtcNow.Date);
            Assert.Contains(vanillaData, d => d.Date.Date == DateTime.UtcNow.AddDays(-1).Date);
            Assert.True(vanillaData.All(d => d.Count == 1));
            Assert.True(chocolateData.Count == 1);
            Assert.Contains(chocolateData, d => d.Date.Date == DateTime.UtcNow.Date);
            Assert.True(vanillaData.All(d => d.Count == 1));

            // Submit new words and recalculate counts.

            // Arrange
            handler = new Service.Handlers.SubmitWordsHandler(Common.GetDbContext(_connectionString), Common.GetMapper());
            var messageNew = new SubmitWords
            {
                SessionId = _existingSession.Id,
                Words     = new List <string>
                {
                    "chocolate",    // existing
                    "vanilla",      // existing
                },
                DateModified = DateTime.UtcNow
            };

            await handler.Handle(messageNew, new TestsMessageHandlerContext());

            // Act
            await new Worker.Handlers.RefreshCalculationsHandler(Common.GetDbContext(_connectionString), Common.GetMapper())
            .Handle(new RefreshCalculations(), new TestsMessageHandlerContext());

            //Assert
            _context    = Common.GetDbContext(_connectionString);
            vanillaData = await _context.WordDateCounts.Where(s => s.Word == "vanilla").ToListAsync();

            chocolateData = await _context.WordDateCounts.Where(s => s.Word == "chocolate").ToListAsync();

            Assert.True(vanillaData.Count == 2);
            Assert.NotNull(vanillaData.SingleOrDefault(v => v.Date.Date == DateTime.UtcNow.Date && v.Count == 2));
            Assert.NotNull(vanillaData.SingleOrDefault(v => v.Date.Date == DateTime.UtcNow.AddDays(-1).Date&& v.Count == 1));
            Assert.True(chocolateData.Count == 1);
            Assert.NotNull(chocolateData.SingleOrDefault(v => v.Date.Date == DateTime.UtcNow.Date && v.Count == 2));
        }