fix ef collection initilizers (#50)

* fix ef collection initilizers

* add tests to catch regression
This commit is contained in:
2026-04-05 13:13:09 +02:00
committed by GitHub
parent c7c6c626e1
commit af1d600432
4 changed files with 169 additions and 6 deletions
@@ -0,0 +1,80 @@
using Kemkas.Web.Db.Enums;
using Kemkas.Web.Db.Models;
namespace Kemkas.Web.Tests.Db.Models;
public class CharacterCollectionMutabilityTests
{
[Fact]
public void V1Karakter_CollectionsAreMutableForEfMaterialization()
{
var karakter = new V1Karakter { Nev = "Aron" };
Assert.False(karakter.KarakterKepzettsegek.GetType().IsArray);
Assert.False(karakter.Szintlepesek.GetType().IsArray);
Assert.False(karakter.Felszereles.GetType().IsArray);
karakter.KarakterKepzettsegek.Add(new V1KarakterKepzettseg
{
Kepzettseg = Kepzettseg1E.Alkimia,
Karakter = null!
});
karakter.Szintlepesek.Add(new V1Szintlepes
{
KarakterSzint = 1,
HpRoll = 8,
Karakter = null!
});
karakter.Felszereles.Add(new V1Felszereles
{
Name = "kard",
Karakter = null!
});
Assert.Single(karakter.KarakterKepzettsegek);
Assert.Single(karakter.Szintlepesek);
Assert.Single(karakter.Felszereles);
}
[Fact]
public void V2Karakter_CollectionsAreMutableForEfMaterialization()
{
var karakter = new V2Karakter { Nev = "Belia" };
Assert.False(karakter.KarakterKepzettsegek.GetType().IsArray);
Assert.False(karakter.Szintlepesek.GetType().IsArray);
Assert.False(karakter.Felszereles.GetType().IsArray);
Assert.False(karakter.Varazslatok.GetType().IsArray);
karakter.KarakterKepzettsegek.Add(new V2KarakterKepzettseg
{
Kepzettseg = Kepzettseg2E.Alkimia,
Karakter = null!
});
karakter.Szintlepesek.Add(new V2Szintlepes
{
KarakterSzint = 1,
Osztaly = Osztaly2E.Harcos,
HpRoll = 9,
Karakter = null!
});
karakter.Felszereles.Add(new V2Felszereles
{
TargyId = "kard",
Count = 1,
Karakter = null!
});
karakter.Varazslatok.Add(new V2KarakterVarazslat
{
VarazslatId = "v_tuz",
Osztaly = Osztaly2E.Varazslo,
Karakter = null!
});
Assert.Single(karakter.KarakterKepzettsegek);
Assert.Single(karakter.Szintlepesek);
Assert.Single(karakter.Felszereles);
Assert.Single(karakter.Varazslatok);
}
}
@@ -0,0 +1,83 @@
using System.Text.Json;
using Kemkas.Web.ViewModels;
namespace Kemkas.Web.Tests.ViewModels;
public class CharacterDtoJsonDefaultsTests
{
[Fact]
public void Deserialize1E_WithMissingArrayFields_UsesEmptyCollectionDefaults()
{
const string json = """
{
"name": "Aron",
"jellem": "TJ",
"faj": "f_ember",
"osztaly": "o_harcos",
"tulajdonsagok": {
"t_ero": 10,
"t_ugy": 10,
"t_egs": 10,
"t_int": 10,
"t_bol": 10,
"t_kar": 10
},
"felszereles": {
"pancelID": "lancruha",
"pajzsID": "fa_pajzs"
}
}
""";
var dto = JsonSerializer.Deserialize<Karakter1eDto>(json);
Assert.NotNull(dto);
Assert.Empty(dto.Kepzettsegek);
Assert.Null(dto.Tolvajkepzettsegek);
Assert.Empty(dto.HpRolls);
Assert.Empty(dto.TulajdonsagNovelesek);
Assert.Empty(dto.HarcosSpecializaciok);
Assert.Empty(dto.KalozKritikus);
Assert.Empty(dto.Felszereles1E.FegyverIds);
}
[Fact]
public void Deserialize2E_WithMissingArrayFields_UsesEmptyCollectionDefaults()
{
const string json = """
{
"nev": "Belia",
"jellem": "TS",
"faj": "f_2e_ember",
"tulajdonsagok": {
"t_ero": 10,
"t_ugy": 10,
"t_egs": 10,
"t_int": 10,
"t_bol": 10,
"t_kar": 10
},
"felszereles": {
"pancelID": "bor",
"pajzsID": "kis_pajzs",
"at": 10,
"el": 20,
"et": 30
}
}
""";
var dto = JsonSerializer.Deserialize<Karakter2eDto>(json);
Assert.NotNull(dto);
Assert.Empty(dto.Kepzettsegek);
Assert.Null(dto.Tolvajkepzettsegek);
Assert.Empty(dto.Szintlepesek);
Assert.Empty(dto.Felszereles.Fegyverek);
Assert.Empty(dto.Felszereles.Viselt);
Assert.Empty(dto.Felszereles.Cipelt);
Assert.Empty(dto.Felszereles.Aprosagok);
Assert.Null(dto.Varazslatok);
}
}
+3 -3
View File
@@ -35,11 +35,11 @@ public class V1Karakter
public ApplicationUser? OwnerUser { get; set; } public ApplicationUser? OwnerUser { get; set; }
[InverseProperty(nameof(V1KarakterKepzettseg.Karakter))] [InverseProperty(nameof(V1KarakterKepzettseg.Karakter))]
public virtual IEnumerable<V1KarakterKepzettseg> KarakterKepzettsegek { get; set; } = []; public virtual ICollection<V1KarakterKepzettseg> KarakterKepzettsegek { get; set; } = new List<V1KarakterKepzettseg>();
[InverseProperty(nameof(V1Szintlepes.Karakter))] [InverseProperty(nameof(V1Szintlepes.Karakter))]
public virtual IEnumerable<V1Szintlepes> Szintlepesek { get; set; } = []; public virtual ICollection<V1Szintlepes> Szintlepesek { get; set; } = new List<V1Szintlepes>();
[InverseProperty(nameof(V1Felszereles.Karakter))] [InverseProperty(nameof(V1Felszereles.Karakter))]
public virtual IEnumerable<V1Felszereles> Felszereles { get; set; } = []; public virtual ICollection<V1Felszereles> Felszereles { get; set; } = new List<V1Felszereles>();
} }
+3 -3
View File
@@ -40,13 +40,13 @@ public class V2Karakter
public ApplicationUser? OwnerUser { get; set; } public ApplicationUser? OwnerUser { get; set; }
[InverseProperty(nameof(V2KarakterKepzettseg.Karakter))] [InverseProperty(nameof(V2KarakterKepzettseg.Karakter))]
public virtual IEnumerable<V2KarakterKepzettseg> KarakterKepzettsegek { get; set; } = []; public virtual ICollection<V2KarakterKepzettseg> KarakterKepzettsegek { get; set; } = new List<V2KarakterKepzettseg>();
[InverseProperty(nameof(V2Szintlepes.Karakter))] [InverseProperty(nameof(V2Szintlepes.Karakter))]
public virtual IEnumerable<V2Szintlepes> Szintlepesek { get; set; } = []; public virtual ICollection<V2Szintlepes> Szintlepesek { get; set; } = new List<V2Szintlepes>();
[InverseProperty(nameof(V2Felszereles.Karakter))] [InverseProperty(nameof(V2Felszereles.Karakter))]
public virtual IEnumerable<V2Felszereles> Felszereles { get; set; } = []; public virtual ICollection<V2Felszereles> Felszereles { get; set; } = new List<V2Felszereles>();
[InverseProperty(nameof(V2KarakterVarazslat.Karakter))] [InverseProperty(nameof(V2KarakterVarazslat.Karakter))]
public virtual ISet<V2KarakterVarazslat> Varazslatok { get; set; } = new HashSet<V2KarakterVarazslat>(); public virtual ISet<V2KarakterVarazslat> Varazslatok { get; set; } = new HashSet<V2KarakterVarazslat>();