File size: 2,871 Bytes
3dd5c9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System.ComponentModel.DataAnnotations;
using TaskTrackingSystem.Shared.Localization;
using TaskTrackingSystem.Shared.Models.Project;
using TaskTrackingSystem.Shared.Models.User;
using Xunit;

namespace TaskTrackingSystem.Tests;

public sealed class BilingualPhaseTests
{
    [Fact]
    public void LanguageDetector_ClassifiesBurmeseEnglishMixedAndEmpty()
    {
        var detector = new LanguageDetectionService();

        Assert.Equal(DetectedContentLanguage.Empty, detector.Detect(" ").Language);
        Assert.Equal(DetectedContentLanguage.Burmese, detector.Detect("စီမံကိန်း").Language);
        Assert.Equal(DetectedContentLanguage.English, detector.Detect("Project Dashboard").Language);
        Assert.Equal(DetectedContentLanguage.Mixed, detector.Detect("Dashboard စီမံကိန်း").Language);
    }

    [Fact]
    public void ProjectValidation_AllowsEitherLanguageButRejectsNeither()
    {
        Assert.Empty(Validate(new CreateProjectDto { Name = "English" }));
        Assert.Empty(Validate(new CreateProjectDto { NameMy = "မြန်မာ" }));
        Assert.NotEmpty(Validate(new CreateProjectDto()));
    }

    [Fact]
    public void UserValidation_RequiresACompleteNameInOneLanguage()
    {
        Assert.DoesNotContain(Validate(User(firstName: "A", lastName: "User")), result => result.ErrorMessage?.Contains("complete name", StringComparison.OrdinalIgnoreCase) == true);
        Assert.DoesNotContain(Validate(User(firstNameMy: "အ", lastNameMy: "သုံး")), result => result.ErrorMessage?.Contains("complete name", StringComparison.OrdinalIgnoreCase) == true);
        Assert.Contains(Validate(User(firstName: "A", firstNameMy: "အ")), result => result.ErrorMessage?.Contains("complete name", StringComparison.OrdinalIgnoreCase) == true);
    }

    [Fact]
    public async Task UnconfiguredTranslationDoesNotFakeText()
    {
        var result = await new NoOpContentTranslationService().TranslateAsync("Project", "en", "my");

        Assert.False(result.Success);
        Assert.Null(result.TranslatedText);
        Assert.False(result.WasGenerated);
        Assert.Equal("none", result.Provider);
    }

    private static List<ValidationResult> Validate(object model)
    {
        var results = new List<ValidationResult>();
        Validator.TryValidateObject(model, new ValidationContext(model), results, true);
        return results;
    }

    private static CreateUserDto User(string? firstName = null, string? lastName = null, string? firstNameMy = null, string? lastNameMy = null) => new()
    {
        Username = "testuser",
        Email = "test@example.com",
        Password = "Password1!",
        RoleId = 1,
        FirstName = firstName ?? string.Empty,
        LastName = lastName ?? string.Empty,
        FirstNameMy = firstNameMy,
        LastNameMy = lastNameMy
    };
}