Skip to content

Commit 568e35a

Browse files
committed
Improve testing and do some cleanup
1 parent 2054d48 commit 568e35a

9 files changed

Lines changed: 87 additions & 47 deletions

File tree

src/Altinn.App.Core/Features/DataProcessing/DataModelFieldCalculator.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,26 +66,27 @@ string rawCalculationConfig
6666

6767
foreach (var (baseField, calculation) in dataModelFieldCalculations)
6868
{
69-
var resolvedFields = await dataAccessor
70-
.GetLayoutEvaluatorState()
71-
.GetResolvedKeys(
72-
new DataReference() { Field = baseField, DataElementIdentifier = dataElementIdentifier }
73-
);
69+
var resolvedFields = formDataWrapper.GetResolvedKeys(baseField);
7470
foreach (var resolvedField in resolvedFields)
7571
{
72+
var resolvedFieldReference = new DataReference()
73+
{
74+
Field = resolvedField,
75+
DataElementIdentifier = dataElementIdentifier,
76+
};
7677
var context = new ComponentContext(
7778
dataAccessor,
7879
component: null,
79-
rowIndices: ExpressionHelper.GetRowIndices(resolvedField.Field),
80-
dataElementIdentifier: resolvedField.DataElementIdentifier
80+
rowIndices: ExpressionHelper.GetRowIndices(resolvedField),
81+
dataElementIdentifier: dataElementIdentifier
8182
);
82-
var positionalArguments = new ExpressionValue[] { resolvedField.Field };
83+
var positionalArguments = new ExpressionValue[] { resolvedFieldReference.Field };
8384

8485
await RunCalculation(
8586
dataAccessor,
8687
context,
8788
formDataWrapper,
88-
resolvedField,
89+
resolvedFieldReference,
8990
positionalArguments,
9091
calculation
9192
);

src/Altinn.App.Core/Internal/Data/IFormDataWrapper.cs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using Altinn.App.Core.Helpers;
44
using Altinn.App.Core.Helpers.DataModel;
55
using Altinn.App.Core.Internal.Expressions;
6-
using Altinn.App.Core.Models.Layout;
76
using Altinn.Platform.Storage.Interface.Models;
87

98
namespace Altinn.App.Core.Internal.Data;
@@ -287,26 +286,22 @@ private static int InvokeReturnIntOrError(MethodInfo info, object instance)
287286
}
288287

289288
/// <summary>
290-
/// Get a list of all possible keys for the given data model
289+
/// Get a list of all possible keys for the given data model at the path
291290
/// </summary>
292291
/// <example>
293-
/// intro.fnr
294-
/// group[0].name
295-
/// group[0].age
296-
/// group[1].name
297-
/// group[1].age
292+
/// group.name -> ["group[0].name", "group[1].name"]
293+
/// group.age -> ["group[0].age", "group[1].age"]
298294
/// </example>
299-
public static DataReference[] GetResolvedKeys(this IFormDataWrapper formDataWrapper, DataReference reference)
295+
public static string[] GetResolvedKeys(this IFormDataWrapper formDataWrapper, string path)
300296
{
301297
//TODO: write more efficient code that uses the formDataWrapper to resolve keys instead of reflection in DataModelWrapper
298+
// The current implementation also does not throw exceptions when the path ends in an enumerable.
299+
// When resolving "group" it is not clear if the result should be "group[0]", "group[1]", or just "group"."
302300
var data = formDataWrapper.BackingData<object>();
303301
#pragma warning disable CS0618 // Type or member is obsolete
304302
var dataModelWrapper = new DataModelWrapper(data);
305303
#pragma warning restore CS0618 // Type or member is obsolete
306-
return dataModelWrapper
307-
.GetResolvedKeys(reference.Field)
308-
.Select(resolvedField => reference with { Field = resolvedField })
309-
.ToArray();
304+
return dataModelWrapper.GetResolvedKeys(path);
310305
}
311306

312307
private static int GetMaxBufferLength(ReadOnlySpan<char> path, ReadOnlySpan<int> rowIndexes)

src/Altinn.App.Core/Internal/Expressions/LayoutEvaluatorState.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,9 @@ private static bool RowIndexMatch(int[]? searchRowIndexes, int[]? componentRowIn
235235
public async Task<DataReference[]> GetResolvedKeys(DataReference reference)
236236
{
237237
var data = await DataAccessor.GetFormDataWrapper(reference.DataElementIdentifier);
238-
return data.GetResolvedKeys(reference);
238+
return data.GetResolvedKeys(reference.Field)
239+
.Select(resolvedField => reference with { Field = resolvedField })
240+
.ToArray();
239241
}
240242

241243
/// <summary>

test/Altinn.App.Core.Tests/Features/DataProcessing/DataModelFieldCalculatorTests.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Altinn.App.Core.Tests.LayoutExpressions.TestUtilities;
1212
using Altinn.App.Core.Tests.TestUtils;
1313
using Altinn.Platform.Storage.Interface.Models;
14+
using Microsoft.Extensions.Logging;
1415
using Microsoft.Extensions.Logging.Testing;
1516
using Microsoft.Extensions.Options;
1617
using Moq;
@@ -133,6 +134,7 @@ public async Task RunDataModelFieldCalculationTests(string fileName, string fold
133134
if (expected.Result.HasValue)
134135
{
135136
Assert.Equal(expected.Result.Value.ToObject(), result.Get(expected.Field));
137+
Assert.Empty(_logger.Collector.GetSnapshot());
136138
}
137139
else
138140
{
@@ -185,13 +187,6 @@ private void Setup(DataModelFieldCalculatorTestModel testCase)
185187
_dataElement
186188
);
187189

188-
var evaluatorState = new LayoutEvaluatorState(
189-
_instanceDataAccessor,
190-
componentModel,
191-
translationService,
192-
_frontendSettings.Value
193-
);
194-
195190
_appResources
196191
.Setup(ar => ar.GetTexts("org", "app", "nb"))
197192
.ReturnsAsync(
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
{
2+
"name": "Should set multiple values when in a group",
3+
"expects": [
4+
{
5+
"field": "form.children[0].total",
6+
"result": 200
7+
},
8+
{
9+
"field": "form.children[1].total",
10+
"result": 220
11+
}
12+
],
13+
"calculationConfig": {
14+
"$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/calculation/calculation.schema.v1.json",
15+
"calculations": {
16+
"form.children.total": {
17+
"expression": ["multiply", ["dataModel", "form.children.price"], ["dataModel", "form.children.quantity"]]
18+
}
19+
}
20+
},
21+
"formData": {
22+
"form": {
23+
"children": [
24+
{
25+
"price": 100,
26+
"quantity": 2,
27+
"total": 0
28+
},
29+
{
30+
"price": 5,
31+
"quantity": 44,
32+
"total": 0
33+
}
34+
]
35+
}
36+
},
37+
"layouts": {
38+
"Page": {
39+
"$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout.schema.v1.json",
40+
"data": {
41+
"layout": [
42+
{
43+
"id": "name-input",
44+
"type": "Input",
45+
"dataModelBindings": {
46+
"simpleBinding": "form.name"
47+
},
48+
"hidden": true
49+
}
50+
]
51+
}
52+
}
53+
}
54+
}

test/Altinn.App.Core.Tests/Features/DataProcessing/data-field-value-calculator-tests/component-lookup-hidden.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
{
2-
"name": "Should not set field when looking up hidden component",
2+
"name": "Should set field when looking up hidden component",
33
"expects": [
44
{
55
"field": "form.name",
6-
"result": "feil"
6+
"result": "nyVerdi"
77
}
88
],
99
"calculationConfig": {
1010
"$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/calculation/calculation.schema.v1.json",
1111
"calculations": {
1212
"form.name": {
13-
"expression": ["equals", ["dataModel", ["argv", 0]], "feil"]
13+
"expression": "nyVerdi"
1414
}
1515
}
1616
},

test/Altinn.App.Core.Tests/Features/DataProcessing/data-field-value-calculator-tests/hidden-field.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
{
2-
"name": "Should not set field when component is hidden",
2+
"name": "Should set field when component is hidden",
33
"expects": [
44
{
55
"field": "form.name",
6-
"result": "feil"
6+
"result": "nyVerdi"
77
}
88
],
99
"calculationConfig": {
1010
"$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/calculation/calculation.schema.v1.json",
1111
"calculations": {
1212
"form.name": {
13-
"expression": ["equals", ["dataModel", ["argv", 0]], "feil"]
13+
"expression": "nyVerdi"
1414
}
1515
}
1616
},

test/Altinn.App.Core.Tests/Features/DataProcessing/data-field-value-calculator-tests/hidden-page.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
{
2-
"name": "Should not set field if field is on hidden page",
2+
"name": "Should set field if field is on hidden page",
33
"expects": [
44
{
55
"field": "form.name",
6-
"result": "none"
6+
"result": "newValue"
77
}
88
],
99
"calculationConfig": {
1010
"$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/calculation/calculation.schema.v1.json",
1111
"calculations": {
1212
"form.name": {
13-
"expression": ["equals", ["dataModel", ["argv", 0]], "none"]
13+
"expression": "newValue"
1414
}
1515
}
1616
},

test/Altinn.App.SourceGenerator.Integration.Tests/UnitTest/TestGetResolvedKeys.cs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,7 @@ public void TestResolvedKeys(string field, string[] expectedKeys)
119119

120120
// Test formDataWrapper
121121
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();
122+
var resolvedKeys = dataWrapper.GetResolvedKeys(field);
126123
Assert.Equal(expectedKeys, resolvedKeys);
127124
}
128125

@@ -136,11 +133,7 @@ private void TestResolvedKeys_ErrorConditions(string field)
136133
Assert.Contains("ResolveKeys", exception.Message);
137134

138135
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-
);
136+
var dataException = Assert.Throws<ArgumentException>(() => dataWrapper.GetResolvedKeys(field));
144137
Assert.Contains("ResolveKeys", dataException.Message);
145138
}
146139
}

0 commit comments

Comments
 (0)