public async Task UpdateAsync_EntryDoesNotExists_ReturnsNull()
        {
            // Arrange
            using var dbContext = CreateDbContext();
            var user = await CreateTestUserAsync(dbContext);

            var userContextAccessorMock = new Mock <IUserContextAccessor>();

            userContextAccessorMock.Setup(m => m.GetUserId()).Returns(user.Id);
            userContextAccessorMock.Setup(m => m.IsAdminUser()).Returns(false);

            var workEntriesService = new WorkEntriesService(dbContext, Mock.Of <IDbErrorHandler>(), userContextAccessorMock.Object);

            // Act
            var entryToUpdate = new WorkEntry
            {
                Id         = Guid.NewGuid(),
                Date       = new DateTime(2021, 1, 1),
                HoursSpent = 6,
                UserId     = user.Id + "1",
                Notes      = "Some notes..."
            };

            var entry = await workEntriesService.UpdateAsync(entryToUpdate);

            Assert.Null(entry);
        }
        public async Task UpdateAsync_AnotherUser_ReturnsNull(bool isAdmin, bool isNullResult)
        {
            // Arrange
            using var dbContext = CreateDbContext();
            var user = await CreateTestUserAsync(dbContext);

            var anotherUser = await CreateTestUserAsync(dbContext);

            var userContextAccessorMock = new Mock <IUserContextAccessor>();

            userContextAccessorMock.Setup(m => m.GetUserId()).Returns(user.Id);
            userContextAccessorMock.Setup(m => m.IsAdminUser()).Returns(isAdmin);

            var workEntriesService = new WorkEntriesService(dbContext, Mock.Of <IDbErrorHandler>(), userContextAccessorMock.Object);
            var entry = await CreateWorkEntry(dbContext, anotherUser.Id);

            // Act
            var entryToUpdate = new WorkEntry
            {
                Id         = entry.Id,
                Date       = new DateTime(2021, 1, 1),
                HoursSpent = 6,
                Notes      = "Some notes..."
            };

            entry = await workEntriesService.UpdateAsync(entryToUpdate);

            Assert.Equal(isNullResult, entry == null);
        }
        public async Task UpdateAsync_EntryExists_UpdatesEntry()
        {
            // Arrange
            using var dbContext = CreateDbContext();
            var user = await CreateTestUserAsync(dbContext);

            var entry = await CreateWorkEntry(dbContext, user.Id);

            var userContextAccessorMock = new Mock <IUserContextAccessor>();

            userContextAccessorMock.Setup(m => m.GetUserId()).Returns(user.Id);
            userContextAccessorMock.Setup(m => m.IsAdminUser()).Returns(false);

            var workEntriesService = new WorkEntriesService(dbContext, Mock.Of <IDbErrorHandler>(), userContextAccessorMock.Object);

            // Act
            var entryToUpdate = new WorkEntry
            {
                Id         = entry.Id,
                Date       = new DateTime(2021, 1, 1),
                HoursSpent = 6,
                UserId     = user.Id + "1",
                Notes      = "Some notes..."
            };

            entry = await workEntriesService.UpdateAsync(entryToUpdate);

            Assert.NotEqual(entryToUpdate.UserId, entry.UserId);

            // Line above tests that a user can't update the UserId field.
            // Now assign the same user id to compare all properties of both objects,
            // otherwise assert will fail
            entryToUpdate.UserId = entry.UserId;
            AssertEqual(entryToUpdate, entry);

            // assert entry state directly in the database
            entry = await dbContext.WorkEntries.FindAsync(entry.Id);

            AssertEqual(entryToUpdate, entry);
        }