Compare commits
No commits in common. "b94e5fd4a814b36ecb42f47bcd8f0339321770fd" and "a9e9a6e457479106be01a4ade5bb2ef091a7305f" have entirely different histories.
b94e5fd4a8
...
a9e9a6e457
4 changed files with 0 additions and 472 deletions
|
|
@ -1,161 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using GermanApp.Application.DTOs;
|
||||
using GermanApp.Application.Services;
|
||||
using GermanApp.Domain.Entities;
|
||||
using GermanApp.Domain.Interfaces;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Moq;
|
||||
|
||||
namespace GermanApp.Tests.Unit.Application.Services;
|
||||
|
||||
[TestClass]
|
||||
public class LessonServiceTests
|
||||
{
|
||||
private Mock<ILessonRepository> _mockLessonRepo;
|
||||
private Mock<ILevelRepository> _mockLevelRepo;
|
||||
private LessonService _service;
|
||||
|
||||
[TestInitialize]
|
||||
public void Setup()
|
||||
{
|
||||
_mockLessonRepo = new Mock<ILessonRepository>();
|
||||
_mockLevelRepo = new Mock<ILevelRepository>();
|
||||
_service = new LessonService(_mockLessonRepo.Object, _mockLevelRepo.Object);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetAllLessonsAsync_ReturnsMappedDtoList()
|
||||
{
|
||||
var lessons = new List<Lesson> { Lesson.Create(1, "Test", 1, "Topic", "Desc") };
|
||||
_mockLessonRepo.Setup(r => r.GetAllAsync(It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(lessons);
|
||||
|
||||
var result = await _service.GetAllLessonsAsync();
|
||||
|
||||
Assert.AreEqual(1, result.Count);
|
||||
Assert.AreEqual("Test", result[0].Title);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetLessonByIdAsync_WithExistingId_ReturnsLesson()
|
||||
{
|
||||
var lesson = Lesson.Create(1, "Test", 1, "Topic", "Desc");
|
||||
_mockLessonRepo.Setup(r => r.GetByIdAsync(1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(lesson);
|
||||
|
||||
var result = await _service.GetLessonByIdAsync(1);
|
||||
|
||||
Assert.IsNotNull(result);
|
||||
Assert.AreEqual("Test", result.Title);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetLessonByIdAsync_WithNonExistingId_ReturnsNull()
|
||||
{
|
||||
_mockLessonRepo.Setup(r => r.GetByIdAsync(999, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync((Lesson?)null);
|
||||
|
||||
var result = await _service.GetLessonByIdAsync(999);
|
||||
|
||||
Assert.IsNull(result);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetLessonsByLevelAsync_ReturnsFilteredLessons()
|
||||
{
|
||||
var lessons = new List<Lesson> { Lesson.Create(1, "L1", 1, "T1", "D1") };
|
||||
_mockLessonRepo.Setup(r => r.GetByLevelAsync(1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(lessons);
|
||||
|
||||
var result = await _service.GetLessonsByLevelAsync(1);
|
||||
|
||||
Assert.AreEqual(1, result.Count);
|
||||
Assert.AreEqual("L1", result[0].Title);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task CreateLessonAsync_WithValidDtoAndValidLevel_CreatesLesson()
|
||||
{
|
||||
var level = Level.Create("A1", "A1", 1);
|
||||
var dto = new CreateLessonDto("New", "Desc", 1, 1, "Topic");
|
||||
var lesson = Lesson.Create(1, "New", 1, "Topic", "Desc");
|
||||
|
||||
_mockLevelRepo.Setup(r => r.GetByIdAsync(1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(level);
|
||||
_mockLessonRepo.Setup(r => r.AddAsync(It.IsAny<Lesson>(), It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(lesson);
|
||||
|
||||
var result = await _service.CreateLessonAsync(dto);
|
||||
|
||||
Assert.IsNotNull(result);
|
||||
Assert.AreEqual("New", result.Title);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task UpdateLessonAsync_WithExistingLesson_UpdatesLesson()
|
||||
{
|
||||
var existing = Lesson.Create(1, "Old", 1, "OldT", "OldD");
|
||||
var level = Level.Create("A1", "A1", 1);
|
||||
var dto = new UpdateLessonDto("New", "NewD", 1, 1, "NewT");
|
||||
|
||||
_mockLessonRepo.Setup(r => r.GetByIdAsync(1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(existing);
|
||||
_mockLevelRepo.Setup(r => r.GetByIdAsync(1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(level);
|
||||
_mockLessonRepo.Setup(r => r.UpdateAsync(existing, It.IsAny<CancellationToken>()))
|
||||
.Returns(Task.CompletedTask);
|
||||
|
||||
var result = await _service.UpdateLessonAsync(1, dto);
|
||||
|
||||
Assert.IsNotNull(result);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task DeleteLessonAsync_WithExistingLesson_ReturnsTrue()
|
||||
{
|
||||
var lesson = Lesson.Create(1, "Test", 1, "Topic", "Desc");
|
||||
_mockLessonRepo.Setup(r => r.GetByIdAsync(1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(lesson);
|
||||
_mockLessonRepo.Setup(r => r.DeleteAsync(lesson, It.IsAny<CancellationToken>()))
|
||||
.Returns(Task.CompletedTask);
|
||||
|
||||
var result = await _service.DeleteLessonAsync(1);
|
||||
|
||||
Assert.IsTrue(result);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetBeginnerLessonsAsync_ReturnsA1AndA2Lessons()
|
||||
{
|
||||
var level1 = new List<Lesson> { Lesson.Create(1, "A1L1", 1, "T1", "D1") };
|
||||
var level2 = new List<Lesson> { Lesson.Create(2, "A2L1", 1, "T2", "D2") };
|
||||
|
||||
_mockLessonRepo.Setup(r => r.GetByLevelAsync(1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(level1);
|
||||
_mockLessonRepo.Setup(r => r.GetByLevelAsync(2, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(level2);
|
||||
|
||||
var result = await _service.GetBeginnerLessonsAsync();
|
||||
|
||||
Assert.AreEqual(2, result.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetAdvancedLessonsAsync_ReturnsB2AndC1Lessons()
|
||||
{
|
||||
var level4 = new List<Lesson> { Lesson.Create(4, "B2L1", 1, "T4", "D4") };
|
||||
var level5 = new List<Lesson> { Lesson.Create(5, "C1L1", 1, "T5", "D5") };
|
||||
|
||||
_mockLessonRepo.Setup(r => r.GetByLevelAsync(4, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(level4);
|
||||
_mockLessonRepo.Setup(r => r.GetByLevelAsync(5, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(level5);
|
||||
|
||||
var result = await _service.GetAdvancedLessonsAsync();
|
||||
|
||||
Assert.AreEqual(2, result.Count);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,143 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using GermanApp.Application.DTOs;
|
||||
using GermanApp.Application.Services;
|
||||
using GermanApp.Domain.Entities;
|
||||
using GermanApp.Domain.Interfaces;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Moq;
|
||||
|
||||
namespace GermanApp.Tests.Unit.Application.Services;
|
||||
|
||||
[TestClass]
|
||||
public class LevelServiceTests
|
||||
{
|
||||
private Mock<ILevelRepository> _mockRepo;
|
||||
private LevelService _service;
|
||||
|
||||
[TestInitialize]
|
||||
public void Setup()
|
||||
{
|
||||
_mockRepo = new Mock<ILevelRepository>();
|
||||
_service = new LevelService(_mockRepo.Object);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetAllLevelsAsync_ReturnsMappedDtoList()
|
||||
{
|
||||
var levels = new List<Level> { Level.Create("A1", "A1", 1) };
|
||||
_mockRepo.Setup(r => r.GetAllOrderedAsync(It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(levels);
|
||||
|
||||
var result = await _service.GetAllLevelsAsync();
|
||||
|
||||
Assert.AreEqual(1, result.Count);
|
||||
Assert.AreEqual("A1", result[0].Name);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetLevelByIdAsync_WithExistingId_ReturnsLevel()
|
||||
{
|
||||
var level = Level.Create("A1", "A1", 1);
|
||||
_mockRepo.Setup(r => r.GetByIdAsync(1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(level);
|
||||
|
||||
var result = await _service.GetLevelByIdAsync(1);
|
||||
|
||||
Assert.IsNotNull(result);
|
||||
Assert.AreEqual("A1", result.Name);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetLevelByIdAsync_WithNonExistingId_ReturnsNull()
|
||||
{
|
||||
_mockRepo.Setup(r => r.GetByIdAsync(999, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync((Level?)null);
|
||||
|
||||
var result = await _service.GetLevelByIdAsync(999);
|
||||
|
||||
Assert.IsNull(result);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetLevelByCodeAsync_WithExistingCode_ReturnsLevel()
|
||||
{
|
||||
var level = Level.Create("A1", "A1", 1);
|
||||
_mockRepo.Setup(r => r.GetByCodeAsync("A1", It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(level);
|
||||
|
||||
var result = await _service.GetLevelByCodeAsync("A1");
|
||||
|
||||
Assert.IsNotNull(result);
|
||||
Assert.AreEqual("A1", result.Code);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task CreateLevelAsync_WithValidDto_CallsAddAsync()
|
||||
{
|
||||
var dto = new CreateLevelDto("Test", "T1", 1);
|
||||
var level = Level.Create("Test", "T1", 1);
|
||||
_mockRepo.Setup(r => r.AddAsync(It.IsAny<Level>(), It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(level);
|
||||
|
||||
var result = await _service.CreateLevelAsync(dto);
|
||||
|
||||
Assert.IsNotNull(result);
|
||||
_mockRepo.Verify(r => r.AddAsync(It.IsAny<Level>(), It.IsAny<CancellationToken>()), Times.Once);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task UpdateLevelAsync_WithExistingLevel_CallsUpdateAsync()
|
||||
{
|
||||
var existing = Level.Create("A1", "A1", 1);
|
||||
var dto = new UpdateLevelDto("New", "N1", 2);
|
||||
_mockRepo.Setup(r => r.GetByIdAsync(1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(existing);
|
||||
_mockRepo.Setup(r => r.UpdateAsync(existing, It.IsAny<CancellationToken>()))
|
||||
.Returns(Task.CompletedTask);
|
||||
|
||||
var result = await _service.UpdateLevelAsync(1, dto);
|
||||
|
||||
Assert.IsNotNull(result);
|
||||
_mockRepo.Verify(r => r.UpdateAsync(existing, It.IsAny<CancellationToken>()), Times.Once);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task UpdateLevelAsync_WithNonExistingLevel_ReturnsNull()
|
||||
{
|
||||
var dto = new UpdateLevelDto("New", "N1", 2);
|
||||
_mockRepo.Setup(r => r.GetByIdAsync(999, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync((Level?)null);
|
||||
|
||||
var result = await _service.UpdateLevelAsync(999, dto);
|
||||
|
||||
Assert.IsNull(result);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task DeleteLevelAsync_WithExistingLevel_ReturnsTrue()
|
||||
{
|
||||
var level = Level.Create("A1", "A1", 1);
|
||||
_mockRepo.Setup(r => r.GetByIdAsync(1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(level);
|
||||
_mockRepo.Setup(r => r.DeleteAsync(level, It.IsAny<CancellationToken>()))
|
||||
.Returns(Task.CompletedTask);
|
||||
|
||||
var result = await _service.DeleteLevelAsync(1);
|
||||
|
||||
Assert.IsTrue(result);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task DeleteLevelAsync_WithNonExistingLevel_ReturnsFalse()
|
||||
{
|
||||
_mockRepo.Setup(r => r.GetByIdAsync(999, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync((Level?)null);
|
||||
|
||||
var result = await _service.DeleteLevelAsync(999);
|
||||
|
||||
Assert.IsFalse(result);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,167 +0,0 @@
|
|||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using GermanApp.Application.DTOs;
|
||||
using GermanApp.Application.Services;
|
||||
using GermanApp.Domain.Entities;
|
||||
using GermanApp.Domain.Interfaces;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Moq;
|
||||
|
||||
namespace GermanApp.Tests.Unit.Application.Services;
|
||||
|
||||
[TestClass]
|
||||
public class ProgressServiceTests
|
||||
{
|
||||
private Mock<IUserProgressRepository> _mockProgressRepo;
|
||||
private Mock<ILessonRepository> _mockLessonRepo;
|
||||
private Mock<ILevelRepository> _mockLevelRepo;
|
||||
private ProgressService _service;
|
||||
|
||||
[TestInitialize]
|
||||
public void Setup()
|
||||
{
|
||||
_mockProgressRepo = new Mock<IUserProgressRepository>();
|
||||
_mockLessonRepo = new Mock<ILessonRepository>();
|
||||
_mockLevelRepo = new Mock<ILevelRepository>();
|
||||
_service = new ProgressService(
|
||||
_mockProgressRepo.Object,
|
||||
_mockLessonRepo.Object,
|
||||
_mockLevelRepo.Object);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetUserProgressAsync_WithExistingProgress_ReturnsDto()
|
||||
{
|
||||
var progress = UserProgress.Create(1, 1);
|
||||
progress.MarkAsCompleted(85);
|
||||
_mockProgressRepo.Setup(r => r.GetByUserAndLessonAsync(1, 1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(progress);
|
||||
|
||||
var result = await _service.GetUserProgressAsync(1, 1);
|
||||
|
||||
Assert.IsNotNull(result);
|
||||
Assert.IsTrue(result.IsCompleted);
|
||||
Assert.AreEqual(85, result.QuizScore);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetUserProgressAsync_WithNoProgress_ReturnsNull()
|
||||
{
|
||||
_mockProgressRepo.Setup(r => r.GetByUserAndLessonAsync(1, 999, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync((UserProgress?)null);
|
||||
|
||||
var result = await _service.GetUserProgressAsync(1, 999);
|
||||
|
||||
Assert.IsNull(result);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task HasUserCompletedLessonAsync_ReturnsRepositoryResult()
|
||||
{
|
||||
_mockProgressRepo.Setup(r => r.HasUserCompletedLessonAsync(1, 1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(true);
|
||||
|
||||
var result = await _service.HasUserCompletedLessonAsync(1, 1);
|
||||
|
||||
Assert.IsTrue(result);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task MarkLessonAsCompletedAsync_WithNewProgress_CreatesProgress()
|
||||
{
|
||||
_mockProgressRepo.Setup(r => r.GetByUserAndLessonAsync(1, 1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync((UserProgress?)null);
|
||||
var newProgress = UserProgress.Create(1, 1);
|
||||
newProgress.MarkAsCompleted(90);
|
||||
_mockProgressRepo.Setup(r => r.AddAsync(It.IsAny<UserProgress>(), It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(newProgress);
|
||||
|
||||
var result = await _service.MarkLessonAsCompletedAsync(1, 1, 90);
|
||||
|
||||
Assert.IsNotNull(result);
|
||||
Assert.IsTrue(result.IsCompleted);
|
||||
Assert.AreEqual(90, result.QuizScore);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task MarkLessonAsCompletedAsync_WithExistingProgress_UpdatesProgress()
|
||||
{
|
||||
var existingProgress = UserProgress.Create(1, 1);
|
||||
existingProgress.UpdateQuizScore(50);
|
||||
_mockProgressRepo.Setup(r => r.GetByUserAndLessonAsync(1, 1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(existingProgress);
|
||||
_mockProgressRepo.Setup(r => r.UpdateAsync(existingProgress, It.IsAny<CancellationToken>()))
|
||||
.Returns(Task.CompletedTask);
|
||||
|
||||
var result = await _service.MarkLessonAsCompletedAsync(1, 1, 85);
|
||||
|
||||
Assert.IsNotNull(result);
|
||||
Assert.IsTrue(result.IsCompleted);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task UpdateUserProgressAsync_WithNewProgress_CreatesProgress()
|
||||
{
|
||||
var dto = new UpdateUserProgressDto(1, false, 60);
|
||||
_mockProgressRepo.Setup(r => r.GetByUserAndLessonAsync(1, 1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync((UserProgress?)null);
|
||||
var newProgress = UserProgress.Create(1, 1);
|
||||
newProgress.UpdateQuizScore(60);
|
||||
_mockProgressRepo.Setup(r => r.AddAsync(It.IsAny<UserProgress>(), It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(newProgress);
|
||||
|
||||
var result = await _service.UpdateUserProgressAsync(1, dto);
|
||||
|
||||
Assert.IsNotNull(result);
|
||||
Assert.AreEqual(60, result.QuizScore);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task ResetLessonProgressAsync_WithExistingProgress_ReturnsTrue()
|
||||
{
|
||||
var progress = UserProgress.Create(1, 1);
|
||||
progress.MarkAsCompleted(90);
|
||||
_mockProgressRepo.Setup(r => r.GetByUserAndLessonAsync(1, 1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(progress);
|
||||
_mockProgressRepo.Setup(r => r.UpdateAsync(progress, It.IsAny<CancellationToken>()))
|
||||
.Returns(Task.CompletedTask);
|
||||
|
||||
var result = await _service.ResetLessonProgressAsync(1, 1);
|
||||
|
||||
Assert.IsTrue(result);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task ResetLessonProgressAsync_WithNoProgress_ReturnsFalse()
|
||||
{
|
||||
_mockProgressRepo.Setup(r => r.GetByUserAndLessonAsync(1, 999, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync((UserProgress?)null);
|
||||
|
||||
var result = await _service.ResetLessonProgressAsync(1, 999);
|
||||
|
||||
Assert.IsFalse(result);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetAverageScoreForLevelAsync_ReturnsRepositoryResult()
|
||||
{
|
||||
_mockProgressRepo.Setup(r => r.GetAverageScoreForLevelAsync(1, 1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(75.5);
|
||||
|
||||
var result = await _service.GetAverageScoreForLevelAsync(1, 1);
|
||||
|
||||
Assert.AreEqual(75.5, result);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task GetLevelCompletionPercentageAsync_ReturnsRepositoryResult()
|
||||
{
|
||||
_mockProgressRepo.Setup(r => r.GetLevelCompletionPercentageAsync(1, 1, It.IsAny<CancellationToken>()))
|
||||
.ReturnsAsync(60.0);
|
||||
|
||||
var result = await _service.GetLevelCompletionPercentageAsync(1, 1);
|
||||
|
||||
Assert.AreEqual(60.0, result);
|
||||
}
|
||||
}
|
||||
|
|
@ -198,7 +198,6 @@ Each lesson contains:
|
|||
- [x] Create Application/Services/LevelService.cs
|
||||
- [x] Create Application/Services/LessonService.cs
|
||||
- [x] Create Application/Services/ProgressService.cs
|
||||
- [x] Write unit tests for services (30 tests)
|
||||
- [ ] Create Application/Services/LevelService.cs
|
||||
- [ ] Create Application/Services/LessonService.cs
|
||||
- [ ] Create Application/Services/ProgressService.cs
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue