diff --git a/PxWeb.UnitTests/Helpers/NotesFixTests.cs b/PxWeb.UnitTests/Helpers/NotesFixTests.cs new file mode 100644 index 00000000..29a4b9d0 --- /dev/null +++ b/PxWeb.UnitTests/Helpers/NotesFixTests.cs @@ -0,0 +1,67 @@ +using System.Reflection; + +namespace PxWeb.UnitTests.Helpers +{ + [TestClass] + public class NotesFixTests + { + [TestMethod] + public void GetNotes_WhenContent_ShouldReturnEmptyDictonary() + { + // Arrange + var variable = ModelStore.CreateContentVariable("", PlacementType.Stub, 2); + + // Act + var methodInfo = typeof(Bjarte3).GetMethod("GetNotes", BindingFlags.NonPublic | BindingFlags.Static); + var result = methodInfo?.Invoke(null, new object[] { variable }); + + // Assert + Assert.IsNotNull(result); + Assert.IsInstanceOfType(result, typeof(Dictionary)); + Assert.AreEqual(0, ((Dictionary)result).Count); + } + + [TestMethod] + public void GetNotes_WhenOneNoteOnFirstValue_ShouldReturDictonaryWithOneKey() + { + // Arrange + var variable = ModelStore.CreateTimeVariable("", PlacementType.Stub, 10); + variable.Values[0].AddNote(new PCAxis.Paxiom.Note("A note!", NoteType.Value, false)); + var valueCode = variable.Values[0].Code; + + // Act + var methodInfo = typeof(Bjarte3).GetMethod("GetNotes", BindingFlags.NonPublic | BindingFlags.Static); + var result = methodInfo?.Invoke(null, new object[] { variable }); + + // Assert + Assert.IsNotNull(result); + Assert.IsInstanceOfType(result, typeof(Dictionary)); + Assert.AreEqual(1, ((Dictionary)result).Count); + Assert.IsTrue(((Dictionary)result).ContainsKey(valueCode)); + } + + + [TestMethod] + public void GetReapply_WhenOneNoteOnFirstValue_ShouldHaveANotOnFirstValue() + { + // Arrange + const string noteText = "A note!"; + var variable = ModelStore.CreateTimeVariable("", PlacementType.Stub, 10); + variable.Values[0].AddNote(new PCAxis.Paxiom.Note(noteText, NoteType.Value, false)); + var valueCode = variable.Values[0].Code; + var variable2 = ModelStore.CreateTimeVariable("", PlacementType.Stub, 10); + var methodInfo = typeof(Bjarte3).GetMethod("GetNotes", BindingFlags.NonPublic | BindingFlags.Static); + var notes = methodInfo?.Invoke(null, new object[] { variable }) as Dictionary ?? new Dictionary(); + + // Act + var methodInfo2 = typeof(Bjarte3).GetMethod("ReapplyNotes", BindingFlags.NonPublic | BindingFlags.Static); + var result = methodInfo2?.Invoke(null, new object[] { variable2, notes }); + + // Assert + Assert.IsTrue(variable2.Values[0].HasNotes()); + Assert.AreEqual(noteText, variable2.Values[0].Notes[0].Text); + Assert.AreEqual(1, variable2.Values[0].Notes.Count); + + } + } +} diff --git a/PxWeb.UnitTests/ModelStore.cs b/PxWeb.UnitTests/ModelStore.cs index 8c1206a5..b8f4ccb0 100644 --- a/PxWeb.UnitTests/ModelStore.cs +++ b/PxWeb.UnitTests/ModelStore.cs @@ -234,7 +234,7 @@ public static PCAxis.Paxiom.Variable CreateClassificationVariable(string suffix, return variable; } - private static PCAxis.Paxiom.Variable CreateContentVariable(string suffix, PlacementType placementType, int numberOfValues) + public static PCAxis.Paxiom.Variable CreateContentVariable(string suffix, PlacementType placementType, int numberOfValues) { var name = $"cont_{suffix}"; Variable variable = new Variable(name, placementType); diff --git a/PxWeb/Code/Api2/DataSelection/Bjarte3.cs b/PxWeb/Code/Api2/DataSelection/Bjarte3.cs index c37bbf9d..96e15988 100644 --- a/PxWeb/Code/Api2/DataSelection/Bjarte3.cs +++ b/PxWeb/Code/Api2/DataSelection/Bjarte3.cs @@ -261,6 +261,9 @@ private static void ReapplyCodelist(IPXModelBuilder builder, PXMeta meta) { foreach (var variable in meta.Variables) { + + var valueNotes = GetNotes(variable); + if (variable.HasValuesets() && variable.CurrentGrouping is null && variable.CurrentValueSet is null) { builder.ApplyValueSet(variable.Code, variable.ValueSets[0]); @@ -273,6 +276,43 @@ private static void ReapplyCodelist(IPXModelBuilder builder, PXMeta meta) { builder.ApplyValueSet(variable.Code, variable.CurrentValueSet); } + var newVariable = builder.Model.Meta.Variables.FirstOrDefault(v => v.Code == variable.Code); + if (newVariable is not null) + { + ReapplyNotes(newVariable, valueNotes); + } + } + } + + private static Dictionary GetNotes(Variable variable) + { + var valueNotes = new Dictionary(); + //Skip Content variables since they have not other valueset or grouping + if (variable.IsContentVariable) + { + return valueNotes; + } + + foreach (var value in variable.Values.Where(v => v.HasNotes())) + { + valueNotes.Add(value.Code, value.Notes); + } + return valueNotes; + } + + private static void ReapplyNotes(Variable variable, Dictionary valueNotes) + { + + foreach (var valueCode in valueNotes.Keys) + { + var value = variable.Values.FirstOrDefault(v => v.Code == valueCode); + if (value is not null && !value.HasNotes()) + { + foreach (var note in valueNotes[valueCode]) + { + value.AddNote(note); + } + } } } }