Skip to content

Commit d72df87

Browse files
authored
Merge pull request #1 from RockSolidKnowledge/boxcar
Implement Boxcar evaluations
2 parents ad8eb55 + 0b3799e commit d72df87

23 files changed

+3291
-436
lines changed

Rsk.AuthZen.Client.Test/AuthZenBoxCarOptionsTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ public void ToDto_WhenCalled_ShouldTranslateSemanticsCorrectly(BoxcarSemantics s
2222

2323
AuthZenBoxcarOptionsDto dto = sut.ToDto();
2424

25-
dto.Evaluation_semantics.Should().Be(expectedDtoValue);
25+
dto.Evaluations_semantic.Should().Be(expectedDtoValue);
2626
}
2727
}
Lines changed: 343 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,343 @@
1+
using System.Collections.Generic;
2+
using FluentAssertions;
3+
using Xunit;
4+
5+
namespace Rsk.AuthZen.Client.Test;
6+
7+
public class AuthZenBoxcarEvaluationBodyTests
8+
{
9+
[Fact]
10+
public void ToDto_WhenDefaultSubjectIsSet_ShouldPopulateSubject()
11+
{
12+
var defaults = new AuthZenEvaluationBody()
13+
{
14+
Subject = new AuthZenSubject
15+
{
16+
Id = "subject-id",
17+
Type = "subject-type",
18+
Properties = new Dictionary<string, object> { { "key", "value" } }
19+
}
20+
};
21+
22+
23+
var request = new AuthZenBoxcarEvaluationBody
24+
{
25+
DefaultValues = defaults
26+
};
27+
28+
var dto = request.ToDto();
29+
30+
dto.Subject.Should().NotBeNull();
31+
dto.Subject.Id.Should().Be("subject-id");
32+
dto.Subject.Type.Should().Be("subject-type");
33+
dto.Subject.Properties.Keys.Should().Contain("key");
34+
dto.Subject.Properties["key"].Should().Be("value");
35+
}
36+
37+
[Fact]
38+
public void ToDto_WhenDefaultResourceIsSet_ShouldPopulateResource()
39+
{
40+
var defaults = new AuthZenEvaluationBody()
41+
{
42+
Resource = new AuthZenResource
43+
{
44+
Id = "resource-id",
45+
Type = "resource-type",
46+
Properties = new Dictionary<string, object> { { "key", "value" } }
47+
}
48+
};
49+
50+
var request = new AuthZenBoxcarEvaluationBody
51+
{
52+
DefaultValues = defaults
53+
};
54+
55+
var dto = request.ToDto();
56+
57+
dto.Resource.Should().NotBeNull();
58+
dto.Resource.Id.Should().Be("resource-id");
59+
dto.Resource.Type.Should().Be("resource-type");
60+
dto.Resource.Properties.Keys.Should().Contain("key");
61+
dto.Resource.Properties["key"].Should().Be("value");
62+
}
63+
64+
[Fact]
65+
public void ToDto_WhenDefaultActionIsSet_ShouldPopulateAction()
66+
{
67+
var defaults = new AuthZenEvaluationBody()
68+
{
69+
Action = new AuthZenAction
70+
{
71+
Name = "action-name",
72+
Properties = new Dictionary<string, object> { { "key", "value" } }
73+
}
74+
};
75+
76+
var request = new AuthZenBoxcarEvaluationBody
77+
{
78+
DefaultValues = defaults
79+
};
80+
81+
var dto = request.ToDto();
82+
83+
dto.Action.Should().NotBeNull();
84+
dto.Action.Name.Should().Be("action-name");
85+
dto.Action.Properties.Keys.Should().Contain("key");
86+
dto.Action.Properties["key"].Should().Be("value");
87+
}
88+
89+
[Fact]
90+
public void ToDto_WhenDefaultContextIsSet_ShouldPopulateContext()
91+
{
92+
var defaults = new AuthZenEvaluationBody()
93+
{
94+
Context = new Dictionary<string, object>
95+
{
96+
{ "contextKey", "contextValue" }
97+
}
98+
};
99+
100+
var request = new AuthZenBoxcarEvaluationBody
101+
{
102+
DefaultValues = defaults
103+
};
104+
105+
var dto = request.ToDto();
106+
107+
dto.Context.Should().NotBeNull();
108+
dto.Context.Keys.Should().Contain("contextKey");
109+
dto.Context["contextKey"].Should().Be("contextValue");
110+
}
111+
112+
[Fact]
113+
public void ToDto_WhenEvaluationsIsMissing_ShouldNotPopulateEvaluations()
114+
{
115+
var request = new AuthZenBoxcarEvaluationBody
116+
{
117+
Evaluations = null
118+
};
119+
120+
var dto = request.ToDto();
121+
122+
dto.Evaluations.Should().BeNull();
123+
}
124+
125+
[Fact]
126+
public void ToDto_WhenEvaluationsIsEmpty_ShouldNotPopulateEvaluations()
127+
{
128+
var request = new AuthZenBoxcarEvaluationBody
129+
{
130+
Evaluations = new List<AuthZenEvaluationBody>()
131+
};
132+
133+
var dto = request.ToDto();
134+
135+
dto.Evaluations.Should().BeNull();
136+
}
137+
138+
[Fact]
139+
public void ToDto_WhenEvaluationsIsSet_ShouldPopulateEachEvaluation()
140+
{
141+
var request = new AuthZenBoxcarEvaluationBody
142+
{
143+
Evaluations = new List<AuthZenEvaluationBody>
144+
{
145+
new ()
146+
{
147+
Subject = new AuthZenSubject { Id = "eval-subject-id1", Type = "eval-subject-type1" },
148+
Resource = new AuthZenResource { Id = "eval-resource-id1", Type = "eval-resource-type1" },
149+
Action = new AuthZenAction { Name = "eval-action-name1", }
150+
},
151+
152+
new ()
153+
{
154+
Subject = new AuthZenSubject { Id = "eval-subject-id2", Type = "eval-subject-type2" },
155+
Resource = new AuthZenResource { Id = "eval-resource-id2", Type = "eval-resource-type2" },
156+
Action = new AuthZenAction { Name = "eval-action-name2", }
157+
},
158+
159+
new ()
160+
{
161+
Subject = new AuthZenSubject { Id = "eval-subject-id3", Type = "eval-subject-type3" },
162+
Resource = new AuthZenResource { Id = "eval-resource-id3", Type = "eval-resource-type3" },
163+
Action = new AuthZenAction { Name = "eval-action-name3", }
164+
},
165+
}
166+
};
167+
168+
var dto = request.ToDto();
169+
170+
dto.Evaluations.Should().NotBeNull();
171+
dto.Evaluations.Length.Should().Be(3);
172+
173+
dto.Evaluations[0].Subject.Id.Should().Be("eval-subject-id1");
174+
dto.Evaluations[0].Subject.Type.Should().Be("eval-subject-type1");
175+
dto.Evaluations[0].Resource.Id.Should().Be("eval-resource-id1");
176+
dto.Evaluations[0].Resource.Type.Should().Be("eval-resource-type1");
177+
dto.Evaluations[0].Action.Name.Should().Be("eval-action-name1");
178+
179+
dto.Evaluations[1].Subject.Id.Should().Be("eval-subject-id2");
180+
dto.Evaluations[1].Subject.Type.Should().Be("eval-subject-type2");
181+
dto.Evaluations[1].Resource.Id.Should().Be("eval-resource-id2");
182+
dto.Evaluations[1].Resource.Type.Should().Be("eval-resource-type2");
183+
dto.Evaluations[1].Action.Name.Should().Be("eval-action-name2");
184+
185+
dto.Evaluations[2].Subject.Id.Should().Be("eval-subject-id3");
186+
dto.Evaluations[2].Subject.Type.Should().Be("eval-subject-type3");
187+
dto.Evaluations[2].Resource.Id.Should().Be("eval-resource-id3");
188+
dto.Evaluations[2].Resource.Type.Should().Be("eval-resource-type3");
189+
dto.Evaluations[2].Action.Name.Should().Be("eval-action-name3");
190+
}
191+
192+
[Fact]
193+
public void ToDto_WhenEvaluationSubjectIsSet_ShouldPopulateSubject()
194+
{
195+
var request = new AuthZenBoxcarEvaluationBody
196+
{
197+
Evaluations = new List<AuthZenEvaluationBody>()
198+
{
199+
new ()
200+
{
201+
Subject = new AuthZenSubject
202+
{
203+
Id = "subject-id",
204+
Type = "subject-type",
205+
Properties = new Dictionary<string, object> { { "key", "value" } }
206+
}
207+
}
208+
}
209+
};
210+
211+
var dto = request.ToDto();
212+
213+
dto.Evaluations[0].Subject.Should().NotBeNull();
214+
dto.Evaluations[0].Subject.Id.Should().Be("subject-id");
215+
dto.Evaluations[0].Subject.Type.Should().Be("subject-type");
216+
dto.Evaluations[0].Subject.Properties.Keys.Should().Contain("key");
217+
dto.Evaluations[0].Subject.Properties["key"].Should().Be("value");
218+
}
219+
220+
[Fact]
221+
public void ToDto_WhenEvaluationResourceIsSet_ShouldPopulateResource()
222+
{
223+
var request = new AuthZenBoxcarEvaluationBody
224+
{
225+
Evaluations = new List<AuthZenEvaluationBody>()
226+
{
227+
new ()
228+
{
229+
Resource = new AuthZenResource
230+
{
231+
Id = "resource-id",
232+
Type = "resource-type",
233+
Properties = new Dictionary<string, object> { { "key", "value" } }
234+
}
235+
}
236+
}
237+
238+
};
239+
240+
var dto = request.ToDto();
241+
242+
dto.Evaluations[0].Resource.Should().NotBeNull();
243+
dto.Evaluations[0].Resource.Id.Should().Be("resource-id");
244+
dto.Evaluations[0].Resource.Type.Should().Be("resource-type");
245+
dto.Evaluations[0].Resource.Properties.Keys.Should().Contain("key");
246+
dto.Evaluations[0].Resource.Properties["key"].Should().Be("value");
247+
}
248+
249+
[Fact]
250+
public void ToDto_WhenEvaluationActionIsSet_ShouldPopulateAction()
251+
{
252+
var request = new AuthZenBoxcarEvaluationBody
253+
{
254+
Evaluations = new List<AuthZenEvaluationBody>()
255+
{
256+
new ()
257+
{
258+
Action = new AuthZenAction
259+
{
260+
Name = "action-name",
261+
Properties = new Dictionary<string, object> { { "key", "value" } }
262+
}
263+
}
264+
}
265+
};
266+
267+
var dto = request.ToDto();
268+
269+
dto.Evaluations[0].Action.Should().NotBeNull();
270+
dto.Evaluations[0].Action.Name.Should().Be("action-name");
271+
dto.Evaluations[0].Action.Properties.Keys.Should().Contain("key");
272+
dto.Evaluations[0].Action.Properties["key"].Should().Be("value");
273+
}
274+
275+
[Fact]
276+
public void ToDto_WhenEvaluationContextIsSet_ShouldPopulateContext()
277+
{
278+
var request = new AuthZenBoxcarEvaluationBody
279+
{
280+
Evaluations = new List<AuthZenEvaluationBody>()
281+
{
282+
new ()
283+
{
284+
Context = new Dictionary<string, object>
285+
{
286+
{ "contextKey", "contextValue" }
287+
}
288+
}
289+
}
290+
};
291+
292+
var dto = request.ToDto();
293+
294+
dto.Evaluations[0].Context.Should().NotBeNull();
295+
dto.Evaluations[0].Context.Keys.Should().Contain("contextKey");
296+
dto.Evaluations[0].Context["contextKey"].Should().Be("contextValue");
297+
}
298+
299+
[Theory]
300+
[InlineData(BoxcarSemantics.DenyOnFirstDeny)]
301+
[InlineData(BoxcarSemantics.PermitOnFirstPermit)]
302+
[InlineData(BoxcarSemantics.ExecuteAll)]
303+
public void ToDto_OptionsAreProvided_ShouldIncludeOptionsInRequestDto(BoxcarSemantics semantics)
304+
{
305+
var options = new AuthZenBoxcarOptions()
306+
{
307+
Semantics = semantics
308+
};
309+
310+
var request = new AuthZenBoxcarEvaluationBody
311+
{
312+
Evaluations = new List<AuthZenEvaluationBody>
313+
{
314+
new ()
315+
{
316+
Subject = new AuthZenSubject { Id = "eval-subject-id1", Type = "eval-subject-type1" },
317+
Resource = new AuthZenResource { Id = "eval-resource-id1", Type = "eval-resource-type1" },
318+
Action = new AuthZenAction { Name = "eval-action-name1", }
319+
},
320+
321+
new ()
322+
{
323+
Subject = new AuthZenSubject { Id = "eval-subject-id2", Type = "eval-subject-type2" },
324+
Resource = new AuthZenResource { Id = "eval-resource-id2", Type = "eval-resource-type2" },
325+
Action = new AuthZenAction { Name = "eval-action-name2", }
326+
},
327+
328+
new ()
329+
{
330+
Subject = new AuthZenSubject { Id = "eval-subject-id3", Type = "eval-subject-type3" },
331+
Resource = new AuthZenResource { Id = "eval-resource-id3", Type = "eval-resource-type3" },
332+
Action = new AuthZenAction { Name = "eval-action-name3", }
333+
},
334+
},
335+
Options = options
336+
};
337+
338+
var dto = request.ToDto();
339+
340+
dto.Options.Should().NotBeNull();
341+
dto.Options.Should().BeEquivalentTo(options.ToDto());
342+
}
343+
}

0 commit comments

Comments
 (0)