1+ package io .github .perplexhub .rsql ;
2+
3+ import static org .junit .jupiter .api .Assertions .*;
4+ import static org .mockito .Mockito .*;
5+
6+ import java .util .Collections ;
7+ import java .util .Map ;
8+
9+ import io .github .perplexhub .rsql .model .User ;
10+ import jakarta .persistence .EntityManager ;
11+ import jakarta .persistence .TypedQuery ;
12+ import jakarta .persistence .criteria .CriteriaBuilder ;
13+ import jakarta .persistence .criteria .CriteriaQuery ;
14+ import jakarta .persistence .criteria .Predicate ;
15+ import jakarta .persistence .criteria .Root ;
16+
17+ import org .junit .jupiter .api .BeforeEach ;
18+ import org .junit .jupiter .api .Test ;
19+ import org .junit .jupiter .api .extension .ExtendWith ;
20+ import org .mockito .Mock ;
21+ import org .mockito .junit .jupiter .MockitoExtension ;
22+
23+ import cz .jirutka .rsql .parser .RSQLParser ;
24+ import cz .jirutka .rsql .parser .ast .Node ;
25+
26+ @ ExtendWith (MockitoExtension .class )
27+ class RSQLFieldTransformerTest {
28+
29+ @ Mock
30+ private EntityManager entityManager ;
31+
32+ @ Mock
33+ private CriteriaBuilder criteriaBuilder ;
34+
35+ @ Mock
36+ private CriteriaQuery <User > criteriaQuery ;
37+
38+ @ Mock
39+ private Root <User > root ;
40+
41+ @ Mock
42+ private TypedQuery <User > typedQuery ;
43+
44+ private Map <String , String > propertyPathMapper ;
45+
46+ @ BeforeEach
47+ void setUp () {
48+ propertyPathMapper = Collections .emptyMap ();
49+
50+ // Setup field transformers
51+ RSQLCommonSupport .addFieldTransformer (User .class , "number" ,
52+ value -> value .replaceAll ("[^0-9]" , "" ));
53+
54+ RSQLCommonSupport .addFieldTransformer (User .class , "email" ,
55+ value -> value .toLowerCase ());
56+
57+ RSQLCommonSupport .addFieldTransformer (User .class , "phone" ,
58+ value -> value .replaceAll ("[^0-9+]" , "" ));
59+ }
60+
61+ @ Test
62+ void testNumberFieldTransformer () {
63+ // Given
64+ String rsqlQuery = "number=like='123????'" ;
65+ when (entityManager .getCriteriaBuilder ()).thenReturn (criteriaBuilder );
66+ when (entityManager .createQuery (any (CriteriaQuery .class ))).thenReturn (typedQuery );
67+ when (criteriaQuery .from (User .class )).thenReturn (root );
68+ when (root .get ("number" )).thenReturn (mock ());
69+ when (criteriaBuilder .like (any (), eq ("%123%" ))).thenReturn (mock ());
70+
71+ // When
72+ Node rootNode = new RSQLParser ().parse (rsqlQuery );
73+ RSQLJPAPredicateConverter converter = new RSQLJPAPredicateConverter (criteriaBuilder , propertyPathMapper );
74+ Predicate predicate = rootNode .accept (converter , root );
75+
76+ // Then
77+ assertNotNull (predicate );
78+ verify (criteriaBuilder ).like (any (), eq ("%123%" ));
79+ }
80+
81+ @ Test
82+ void testEmailFieldTransformer () {
83+ // Given
84+ String rsqlQuery =
"email=like='[email protected] '" ;
85+ when (entityManager .getCriteriaBuilder ()).thenReturn (criteriaBuilder );
86+ when (entityManager .createQuery (any (CriteriaQuery .class ))).thenReturn (typedQuery );
87+ when (criteriaQuery .from (User .class )).thenReturn (root );
88+ when (root .get ("email" )).thenReturn (mock ());
89+ when (
criteriaBuilder .
like (
any (),
eq (
"%[email protected] %" ))).
thenReturn (
mock ());
90+
91+ // When
92+ Node rootNode = new RSQLParser ().parse (rsqlQuery );
93+ RSQLJPAPredicateConverter converter = new RSQLJPAPredicateConverter (criteriaBuilder , propertyPathMapper );
94+ Predicate predicate = rootNode .accept (converter , root );
95+
96+ // Then
97+ assertNotNull (predicate );
98+ verify (
criteriaBuilder ).
like (
any (),
eq (
"%[email protected] %" ));
99+ }
100+
101+ @ Test
102+ void testPhoneFieldTransformer () {
103+ // Given
104+ String rsqlQuery = "phone=like='+1 (555) 123-4567'" ;
105+ when (entityManager .getCriteriaBuilder ()).thenReturn (criteriaBuilder );
106+ when (entityManager .createQuery (any (CriteriaQuery .class ))).thenReturn (typedQuery );
107+ when (criteriaQuery .from (User .class )).thenReturn (root );
108+ when (root .get ("phone" )).thenReturn (mock ());
109+ when (criteriaBuilder .like (any (), eq ("%+15551234567%" ))).thenReturn (mock ());
110+
111+ // When
112+ Node rootNode = new RSQLParser ().parse (rsqlQuery );
113+ RSQLJPAPredicateConverter converter = new RSQLJPAPredicateConverter (criteriaBuilder , propertyPathMapper );
114+ Predicate predicate = rootNode .accept (converter , root );
115+
116+ // Then
117+ assertNotNull (predicate );
118+ verify (criteriaBuilder ).like (any (), eq ("%+15551234567%" ));
119+ }
120+
121+ @ Test
122+ void testMultipleTransformers () {
123+ // Given
124+ String rsqlQuery =
"number=like='123????' and email=like='[email protected] '" ;
125+ when (entityManager .getCriteriaBuilder ()).thenReturn (criteriaBuilder );
126+ when (entityManager .createQuery (any (CriteriaQuery .class ))).thenReturn (typedQuery );
127+ when (criteriaQuery .from (User .class )).thenReturn (root );
128+ when (root .get ("number" )).thenReturn (mock ());
129+ when (root .get ("email" )).thenReturn (mock ());
130+ when (criteriaBuilder .like (any (), eq ("%123%" ))).thenReturn (mock ());
131+ when (
criteriaBuilder .
like (
any (),
eq (
"%[email protected] %" ))).
thenReturn (
mock ());
132+ when (criteriaBuilder .and (any (), any ())).thenReturn (mock ());
133+
134+ // When
135+ Node rootNode = new RSQLParser ().parse (rsqlQuery );
136+ RSQLJPAPredicateConverter converter = new RSQLJPAPredicateConverter (criteriaBuilder , propertyPathMapper );
137+ Predicate predicate = rootNode .accept (converter , root );
138+
139+ // Then
140+ assertNotNull (predicate );
141+ verify (criteriaBuilder ).like (any (), eq ("%123%" ));
142+ verify (
criteriaBuilder ).
like (
any (),
eq (
"%[email protected] %" ));
143+ }
144+
145+ @ Test
146+ void testTransformerWithInvalidValue () {
147+ // Given
148+ String rsqlQuery = "number=like='abc'" ;
149+ when (entityManager .getCriteriaBuilder ()).thenReturn (criteriaBuilder );
150+ when (entityManager .createQuery (any (CriteriaQuery .class ))).thenReturn (typedQuery );
151+ when (criteriaQuery .from (User .class )).thenReturn (root );
152+ when (root .get ("number" )).thenReturn (mock ());
153+ when (criteriaBuilder .like (any (), eq ("%%" ))).thenReturn (mock ());
154+
155+ // When
156+ Node rootNode = new RSQLParser ().parse (rsqlQuery );
157+ RSQLJPAPredicateConverter converter = new RSQLJPAPredicateConverter (criteriaBuilder , propertyPathMapper );
158+ Predicate predicate = rootNode .accept (converter , root );
159+
160+ // Then
161+ assertNotNull (predicate );
162+ verify (criteriaBuilder ).like (any (), eq ("%%" ));
163+ }
164+ }
0 commit comments