Skip to content

Commit 2054d48

Browse files
committed
Add tests for GetResolvedKeys
1 parent 886c24e commit 2054d48

1 file changed

Lines changed: 146 additions & 0 deletions

File tree

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Altinn.App.Core.Helpers.DataModel;
5+
using Altinn.App.Core.Internal.Data;
6+
using Altinn.App.Core.Models.Layout;
7+
using Altinn.App.SourceGenerator.Integration.Tests.Models;
8+
using Altinn.Platform.Storage.Interface.Models;
9+
using Xunit;
10+
11+
namespace Altinn.App.SourceGenerator.Integration.Tests.UnitTest;
12+
13+
public class TestGetResolvedKeys()
14+
{
15+
private readonly DataElement _dataElement = new()
16+
{
17+
Id = "00000000-0000-0000-0000-000000000000",
18+
DataType = "model",
19+
};
20+
private readonly DataType _dataType = new() { Id = "model" };
21+
22+
/// <summary>
23+
/// Create a shared instance of Skjema for testing.
24+
/// </summary>
25+
private readonly Skjema _skjema = new Skjema()
26+
{
27+
Skjemanummer = "1243",
28+
Skjemaversjon = "x4",
29+
Skjemainnhold =
30+
[
31+
new SkjemaInnhold()
32+
{
33+
Navn = "navn",
34+
Alder = 42,
35+
Deltar = true,
36+
},
37+
new SkjemaInnhold()
38+
{
39+
Navn = "navn2",
40+
Alder = 43,
41+
Deltar = false,
42+
Adresse = new() { Gate = "gate", Postnummer = 1234 },
43+
TidligereAdresse =
44+
[
45+
new() { Gate = "gate1", Postnummer = 1235 },
46+
new()
47+
{
48+
Gate = "gate2",
49+
Postnummer = 1236,
50+
Tags = ["tag1", "tag2"],
51+
},
52+
],
53+
},
54+
],
55+
EierAdresse = null,
56+
};
57+
58+
[Theory]
59+
[InlineData("skjemanummer", new[] { "skjemanummer" })]
60+
[InlineData("skjemainnhold.navn", new[] { "skjemainnhold[0].navn", "skjemainnhold[1].navn" })]
61+
[InlineData("skjemainnhold.alder", new[] { "skjemainnhold[0].alder", "skjemainnhold[1].alder" })]
62+
[InlineData("skjemainnhold[0].alder", new[] { "skjemainnhold[0].alder" })]
63+
[InlineData("skjemainnhold[1].alder", new[] { "skjemainnhold[1].alder" })]
64+
[InlineData("skjemainnhold.deltar", new[] { "skjemainnhold[0].deltar", "skjemainnhold[1].deltar" })]
65+
[InlineData("skjemainnhold.adresse", new[] { "skjemainnhold[0].adresse", "skjemainnhold[1].adresse" })]
66+
[InlineData(
67+
"skjemainnhold.adresse.gate",
68+
new[] { "skjemainnhold[0].adresse.gate", "skjemainnhold[1].adresse.gate" }
69+
)]
70+
[InlineData(
71+
"skjemainnhold.adresse.postnummer",
72+
new[] { "skjemainnhold[0].adresse.postnummer", "skjemainnhold[1].adresse.postnummer" }
73+
)]
74+
[InlineData(
75+
"skjemainnhold.tidligere-adresse.gate",
76+
new[] { "skjemainnhold[1].tidligere-adresse[0].gate", "skjemainnhold[1].tidligere-adresse[1].gate" }
77+
)]
78+
[InlineData("skjemainnhold[0].tidligere-adresse.gate", new string[] { })]
79+
[InlineData(
80+
"skjemainnhold.tidligere-adresse.postnummer",
81+
new[] { "skjemainnhold[1].tidligere-adresse[0].postnummer", "skjemainnhold[1].tidligere-adresse[1].postnummer" }
82+
)]
83+
[InlineData("eierAdresse", new[] { "eierAdresse" })]
84+
[InlineData("eierAdresse.gate", new[] { "eierAdresse.gate" })]
85+
[InlineData("doesnotexist", new string[] { })]
86+
[InlineData("skjemainnhold.doesnotexist", new string[] { })]
87+
// These cases ends in enumerables does not make sense to resolve keys for, and should throw exceptions.
88+
// Currently added as test here to verify current behaviour, but should be removed when the implementation is updated to throw exceptions for these cases.
89+
[InlineData("skjemainnhold", new string[] { "skjemainnhold[0]", "skjemainnhold[1]" })]
90+
[InlineData(
91+
"skjemainnhold.tidligere-adresse",
92+
new string[]
93+
{
94+
"skjemainnhold[0].tidligere-adresse",
95+
"skjemainnhold[1].tidligere-adresse[0]",
96+
"skjemainnhold[1].tidligere-adresse[1]",
97+
}
98+
)]
99+
[InlineData(
100+
"skjemainnhold.tidligere-adresse.tags",
101+
new string[]
102+
{
103+
"skjemainnhold[1].tidligere-adresse[0].tags",
104+
"skjemainnhold[1].tidligere-adresse[1].tags[0]",
105+
"skjemainnhold[1].tidligere-adresse[1].tags[1]",
106+
}
107+
)]
108+
[InlineData(
109+
"skjemainnhold.tidligere-adresse[1]",
110+
new string[] { "skjemainnhold[0].tidligere-adresse", "skjemainnhold[1].tidligere-adresse[1]" }
111+
)]
112+
[InlineData("skjemainnhold[0]", new string[] { "skjemainnhold[0]" })]
113+
public void TestResolvedKeys(string field, string[] expectedKeys)
114+
{
115+
// Test old reflection based implementation
116+
var modelWrapper = new DataModelWrapper(_skjema);
117+
var resolvedKeysReflection = modelWrapper.GetResolvedKeys(field);
118+
Assert.Equal(expectedKeys, resolvedKeysReflection);
119+
120+
// Test formDataWrapper
121+
var dataWrapper = FormDataWrapperFactory.Create(_skjema, _dataType, _dataElement);
122+
var resolvedKeys = dataWrapper
123+
.GetResolvedKeys(new DataReference() { Field = field, DataElementIdentifier = _dataElement })
124+
.Select(k => k.Field)
125+
.ToArray();
126+
Assert.Equal(expectedKeys, resolvedKeys);
127+
}
128+
129+
// [Theory]
130+
// TODO: move test cases here when implementation is updated to throw exceptions for cases that resolves to enumerables, as these cases does not make sense to resolve keys for.
131+
private void TestResolvedKeys_ErrorConditions(string field)
132+
{
133+
// Test old reflection based implementation
134+
var modelWrapper = new DataModelWrapper(_skjema);
135+
var exception = Assert.Throws<Exception>(() => modelWrapper.GetResolvedKeys(field).ToArray());
136+
Assert.Contains("ResolveKeys", exception.Message);
137+
138+
var dataWrapper = FormDataWrapperFactory.Create(_skjema, _dataType, _dataElement);
139+
var dataException = Assert.Throws<ArgumentException>(() =>
140+
dataWrapper
141+
.GetResolvedKeys(new DataReference() { Field = field, DataElementIdentifier = _dataElement })
142+
.ToArray()
143+
);
144+
Assert.Contains("ResolveKeys", dataException.Message);
145+
}
146+
}

0 commit comments

Comments
 (0)