Skip to content

Commit 8b4b72d

Browse files
committed
Add unit tests for IntersectionDetail validation across various data types
1 parent 6971ec2 commit 8b4b72d

2 files changed

Lines changed: 244 additions & 0 deletions

File tree

mustang-core/src/test/java/com/phonepe/mustang/search/SearchTest.java

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import com.phonepe.mustang.detail.impl.EqualSetDetail;
5757
import com.phonepe.mustang.detail.impl.EqualityDetail;
5858
import com.phonepe.mustang.detail.impl.ExistenceDetail;
59+
import com.phonepe.mustang.detail.impl.IntersectionDetail;
5960
import com.phonepe.mustang.detail.impl.NonExistenceDetail;
6061
import com.phonepe.mustang.detail.impl.RangeDetail;
6162
import com.phonepe.mustang.detail.impl.RegexDetail;
@@ -6521,4 +6522,181 @@ public void testDNFMultiValueMultiEclipsingNeutralised() throws JsonProcessingEx
65216522
assertThat(ratificationResult.getAnamolyDetails(), is(empty()));
65226523
}
65236524

6525+
@Test
6526+
public void testDNFPositiveIntersectionMatch() throws Exception {
6527+
Criteria c1 = DNFCriteria.builder()
6528+
.id("C1")
6529+
.conjunction(Conjunction.builder()
6530+
.predicate(IncludedPredicate.builder()
6531+
.lhs("$.a")
6532+
.detail(IntersectionDetail.builder()
6533+
.values(Sets.newHashSet("A1", "A2"))
6534+
.build())
6535+
.build())
6536+
.build())
6537+
.build();
6538+
Criteria c2 = DNFCriteria.builder()
6539+
.id("C2")
6540+
.conjunction(Conjunction.builder()
6541+
.predicate(IncludedPredicate.builder()
6542+
.lhs("$.a")
6543+
.detail(IntersectionDetail.builder()
6544+
.values(Sets.newHashSet("A4", "A5"))
6545+
.build())
6546+
.build())
6547+
.build())
6548+
.build();
6549+
Map<String, Object> testQuery = Maps.newHashMap();
6550+
testQuery.put("a", Lists.newArrayList("A2", "A3"));
6551+
6552+
engine.add("test", c1);
6553+
engine.add("test", c2);
6554+
final Set<String> searchResults = engine.search("test", RequestContext.builder()
6555+
.node(mapper.valueToTree(testQuery))
6556+
.build());
6557+
assertThat(searchResults, hasSize(1));
6558+
assertThat(searchResults, contains("C1"));
6559+
6560+
engine.ratify("test");
6561+
final RatificationResult ratificationResult = engine.getRatificationResult("test");
6562+
assertThat(ratificationResult.getStatus(), is(true));
6563+
assertThat(ratificationResult.getAnamolyDetails(), is(empty()));
6564+
}
6565+
6566+
@Test
6567+
public void testDNFNoIntersectionMatch() throws Exception {
6568+
Criteria c1 = DNFCriteria.builder()
6569+
.id("C1")
6570+
.conjunction(Conjunction.builder()
6571+
.predicate(IncludedPredicate.builder()
6572+
.lhs("$.a")
6573+
.detail(IntersectionDetail.builder()
6574+
.values(Sets.newHashSet("A1", "A2"))
6575+
.build())
6576+
.build())
6577+
.build())
6578+
.build();
6579+
Map<String, Object> testQuery = Maps.newHashMap();
6580+
testQuery.put("a", Lists.newArrayList("A8", "A9"));
6581+
6582+
engine.add("test", c1);
6583+
final Set<String> searchResults = engine.search("test", RequestContext.builder()
6584+
.node(mapper.valueToTree(testQuery))
6585+
.build());
6586+
assertThat(searchResults, is(empty()));
6587+
6588+
engine.ratify("test");
6589+
final RatificationResult ratificationResult = engine.getRatificationResult("test");
6590+
assertThat(ratificationResult.getStatus(), is(true));
6591+
assertThat(ratificationResult.getAnamolyDetails(), is(empty()));
6592+
}
6593+
6594+
@Test
6595+
public void testDNFIntersectionWithNonCollectionQuery() throws Exception {
6596+
// When the query value is not a collection, intersection never matches.
6597+
Criteria c1 = DNFCriteria.builder()
6598+
.id("C1")
6599+
.conjunction(Conjunction.builder()
6600+
.predicate(IncludedPredicate.builder()
6601+
.lhs("$.a")
6602+
.detail(IntersectionDetail.builder()
6603+
.values(Sets.newHashSet("A1", "A2"))
6604+
.build())
6605+
.build())
6606+
.build())
6607+
.build();
6608+
Map<String, Object> testQuery = Maps.newHashMap();
6609+
testQuery.put("a", "A1");
6610+
6611+
engine.add("test", c1);
6612+
final Set<String> searchResults = engine.search("test", RequestContext.builder()
6613+
.node(mapper.valueToTree(testQuery))
6614+
.build());
6615+
assertThat(searchResults, is(empty()));
6616+
6617+
engine.ratify("test");
6618+
final RatificationResult ratificationResult = engine.getRatificationResult("test");
6619+
assertThat(ratificationResult.getStatus(), is(true));
6620+
assertThat(ratificationResult.getAnamolyDetails(), is(empty()));
6621+
}
6622+
6623+
@Test
6624+
public void testCNFPositiveIntersectionMatch() throws Exception {
6625+
Criteria c1 = CNFCriteria.builder()
6626+
.id("C1")
6627+
.disjunction(Disjunction.builder()
6628+
.predicate(IncludedPredicate.builder()
6629+
.lhs("$.a")
6630+
.detail(IntersectionDetail.builder()
6631+
.values(Sets.newHashSet("A1", "A2"))
6632+
.build())
6633+
.build())
6634+
.build())
6635+
.disjunction(Disjunction.builder()
6636+
.predicate(IncludedPredicate.builder()
6637+
.lhs("$.b")
6638+
.detail(IntersectionDetail.builder()
6639+
.values(Sets.newHashSet("B1", "B2"))
6640+
.build())
6641+
.build())
6642+
.build())
6643+
.build();
6644+
Criteria c2 = CNFCriteria.builder()
6645+
.id("C2")
6646+
.disjunction(Disjunction.builder()
6647+
.predicate(IncludedPredicate.builder()
6648+
.lhs("$.b")
6649+
.detail(IntersectionDetail.builder()
6650+
.values(Sets.newHashSet("B8", "B9"))
6651+
.build())
6652+
.build())
6653+
.build())
6654+
.build();
6655+
Map<String, Object> testQuery = Maps.newHashMap();
6656+
testQuery.put("a", Lists.newArrayList("A2", "A3"));
6657+
testQuery.put("b", Lists.newArrayList("B2", "B3"));
6658+
6659+
engine.add("test", c1);
6660+
engine.add("test", c2);
6661+
final Set<String> searchResults = engine.search("test", RequestContext.builder()
6662+
.node(mapper.valueToTree(testQuery))
6663+
.build());
6664+
assertThat(searchResults, hasSize(1));
6665+
assertThat(searchResults, contains("C1"));
6666+
6667+
engine.ratify("test");
6668+
final RatificationResult ratificationResult = engine.getRatificationResult("test");
6669+
assertThat(ratificationResult.getStatus(), is(true));
6670+
assertThat(ratificationResult.getAnamolyDetails(), is(empty()));
6671+
}
6672+
6673+
@Test
6674+
public void testDNFIntegerIntersectionMatch() throws Exception {
6675+
Criteria c1 = DNFCriteria.builder()
6676+
.id("C1")
6677+
.conjunction(Conjunction.builder()
6678+
.predicate(IncludedPredicate.builder()
6679+
.lhs("$.a")
6680+
.detail(IntersectionDetail.builder()
6681+
.values(Sets.newHashSet(1, 2, 3))
6682+
.build())
6683+
.build())
6684+
.build())
6685+
.build();
6686+
Map<String, Object> testQuery = Maps.newHashMap();
6687+
testQuery.put("a", Lists.newArrayList(3, 4, 5));
6688+
6689+
engine.add("test", c1);
6690+
final Set<String> searchResults = engine.search("test", RequestContext.builder()
6691+
.node(mapper.valueToTree(testQuery))
6692+
.build());
6693+
assertThat(searchResults, hasSize(1));
6694+
assertThat(searchResults, contains("C1"));
6695+
6696+
engine.ratify("test");
6697+
final RatificationResult ratificationResult = engine.getRatificationResult("test");
6698+
assertThat(ratificationResult.getStatus(), is(true));
6699+
assertThat(ratificationResult.getAnamolyDetails(), is(empty()));
6700+
}
6701+
65246702
}

mustang-models/src/test/java/com/phonepe/mustang/detail/impl/IntersectionDetailTest.java

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import java.util.Arrays;
2020
import java.util.HashSet;
2121

22+
import java.util.List;
23+
2224
import org.junit.Assert;
2325
import org.junit.Test;
2426

@@ -55,6 +57,70 @@ public void testValidateNonCollection() {
5557
.build();
5658
Assert.assertFalse(detail.validate("A"));
5759
}
60+
61+
@Test
62+
public void testValidateIntegerIntersection() {
63+
IntersectionDetail detail = IntersectionDetail.builder()
64+
.values(new HashSet<>(Arrays.asList(1, 2, 3)))
65+
.build();
66+
Assert.assertTrue(detail.validate(Arrays.asList(3, 4, 5)));
67+
}
68+
69+
@Test
70+
public void testValidateIntegerNoIntersection() {
71+
IntersectionDetail detail = IntersectionDetail.builder()
72+
.values(new HashSet<>(Arrays.asList(1, 2, 3)))
73+
.build();
74+
Assert.assertFalse(detail.validate(Arrays.asList(4, 5, 6)));
75+
}
76+
77+
@Test
78+
public void testValidateFloatingPointIntersection() {
79+
IntersectionDetail detail = IntersectionDetail.builder()
80+
.values(new HashSet<>(Arrays.asList(1.5, 2.5, 3.5)))
81+
.build();
82+
Assert.assertTrue(detail.validate(Arrays.asList(3.5, 4.5)));
83+
}
84+
85+
@Test
86+
public void testValidateFloatingPointNoIntersection() {
87+
IntersectionDetail detail = IntersectionDetail.builder()
88+
.values(new HashSet<>(Arrays.asList(1.5, 2.5, 3.5)))
89+
.build();
90+
Assert.assertFalse(detail.validate(Arrays.asList(4.5, 5.5)));
91+
}
92+
93+
@Test
94+
public void testValidateBooleanIntersection() {
95+
IntersectionDetail detail = IntersectionDetail.builder()
96+
.values(new HashSet<>(List.of(true)))
97+
.build();
98+
Assert.assertTrue(detail.validate(Arrays.asList(true, false)));
99+
}
100+
101+
@Test
102+
public void testValidateBooleanNoIntersection() {
103+
IntersectionDetail detail = IntersectionDetail.builder()
104+
.values(new HashSet<>(List.of(true)))
105+
.build();
106+
Assert.assertFalse(detail.validate(List.of(false)));
107+
}
108+
109+
@Test
110+
public void testValidateMixedTypeNoIntersection() {
111+
IntersectionDetail detail = IntersectionDetail.builder()
112+
.values(new HashSet<>(Arrays.asList(1, "A", true)))
113+
.build();
114+
Assert.assertFalse(detail.validate(Arrays.asList(2, "B", false)));
115+
}
116+
117+
@Test
118+
public void testValidateMixedTypeIntersection() {
119+
IntersectionDetail detail = IntersectionDetail.builder()
120+
.values(new HashSet<>(Arrays.asList(1, "A", true)))
121+
.build();
122+
Assert.assertTrue(detail.validate(Arrays.asList(2, "A", false)));
123+
}
58124
}
59125

60126

0 commit comments

Comments
 (0)