Skip to content

Commit 328ded7

Browse files
authored
Fix RSQLUtilityTest (#1351)
1 parent 5d0a9c0 commit 328ded7

File tree

1 file changed

+65
-34
lines changed
  • hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/rsql

1 file changed

+65
-34
lines changed

hawkbit-repository/hawkbit-repository-jpa/src/test/java/org/eclipse/hawkbit/repository/jpa/rsql/RSQLUtilityTest.java

Lines changed: 65 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import java.util.Arrays;
2424
import java.util.List;
25+
import java.util.concurrent.Callable;
2526

2627
import javax.persistence.criteria.CriteriaBuilder;
2728
import javax.persistence.criteria.CriteriaQuery;
@@ -41,13 +42,18 @@
4142
import org.eclipse.hawkbit.repository.exception.RSQLParameterUnsupportedFieldException;
4243
import org.eclipse.hawkbit.repository.model.SoftwareModule;
4344
import org.eclipse.hawkbit.repository.model.TenantConfigurationValue;
45+
import org.eclipse.hawkbit.repository.model.helper.SystemSecurityContextHolder;
4446
import org.eclipse.hawkbit.repository.model.helper.TenantConfigurationManagementHolder;
47+
import org.eclipse.hawkbit.repository.rsql.RsqlVisitorFactory;
48+
import org.eclipse.hawkbit.repository.rsql.RsqlVisitorFactoryHolder;
4549
import org.eclipse.hawkbit.repository.rsql.VirtualPropertyReplacer;
4650
import org.eclipse.hawkbit.repository.rsql.VirtualPropertyResolver;
51+
import org.eclipse.hawkbit.security.SystemSecurityContext;
4752
import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationProperties.TenantConfigurationKey;
4853
import org.junit.jupiter.api.Test;
4954
import org.junit.jupiter.api.extension.ExtendWith;
5055
import org.mockito.Mock;
56+
import org.mockito.Mockito;
5157
import org.mockito.Spy;
5258
import org.springframework.boot.test.mock.mockito.MockBean;
5359
import org.springframework.context.annotation.Bean;
@@ -72,6 +78,12 @@ public class RSQLUtilityTest {
7278
@MockBean
7379
private TenantConfigurationManagement confMgmt;
7480

81+
@MockBean
82+
private SystemSecurityContext securityContext;
83+
84+
@MockBean
85+
private RsqlVisitorFactory rsqlVisitorFactory;
86+
7587
@Mock
7688
private Root<Object> baseSoftwareModuleRootMock;
7789

@@ -96,6 +108,16 @@ static class Config {
96108
TenantConfigurationManagementHolder tenantConfigurationManagementHolder() {
97109
return TenantConfigurationManagementHolder.getInstance();
98110
}
111+
112+
@Bean
113+
SystemSecurityContextHolder systemSecurityContextHolder() {
114+
return SystemSecurityContextHolder.getInstance();
115+
}
116+
117+
@Bean
118+
RsqlVisitorFactoryHolder rsqlVisitorFactoryHolder() {
119+
return RsqlVisitorFactoryHolder.getInstance();
120+
}
99121
}
100122

101123
private static final TenantConfigurationValue<String> TEST_POLLING_TIME_INTERVAL = TenantConfigurationValue
@@ -108,44 +130,46 @@ TenantConfigurationManagementHolder tenantConfigurationManagementHolder() {
108130
public void rsqlUnsupportedFieldExceptionTest() {
109131
final String rsql1 = "wrongfield == abcd";
110132
assertThatExceptionOfType(RSQLParameterUnsupportedFieldException.class)
111-
.isThrownBy(() -> RSQLUtility.validateRsqlFor(rsql1, TestFieldEnum.class));
133+
.isThrownBy(() -> validateRsqlForTestFields(rsql1));
112134

113135
final String rsql2 = "wrongfield == abcd or TESTFIELD_WITH_SUB_ENTITIES.subentity11 == 0123";
114136
assertThatExceptionOfType(RSQLParameterUnsupportedFieldException.class)
115-
.isThrownBy(() -> RSQLUtility.validateRsqlFor(rsql2, TestFieldEnum.class));
137+
.isThrownBy(() -> validateRsqlForTestFields(rsql2));
116138
}
117139

118140
@Test
119141
@Description("Testing exception in case of not allowed subkey")
120142
public void rsqlUnsupportedSubkeyThrowException() {
121143
final String rsql1 = "TESTFIELD_WITH_SUB_ENTITIES.unsupported == abcd and TESTFIELD_WITH_SUB_ENTITIES.subentity22 == 0123";
122144
assertThatExceptionOfType(RSQLParameterUnsupportedFieldException.class)
123-
.isThrownBy(() -> RSQLUtility.validateRsqlFor(rsql1, TestFieldEnum.class));
145+
.isThrownBy(() -> validateRsqlForTestFields(rsql1));
124146

125147
final String rsql2 = "TESTFIELD_WITH_SUB_ENTITIES.unsupported == abcd or TESTFIELD_WITH_SUB_ENTITIES.subentity22 == 0123";
126148
assertThatExceptionOfType(RSQLParameterUnsupportedFieldException.class)
127-
.isThrownBy(() -> RSQLUtility.validateRsqlFor(rsql2, TestFieldEnum.class));
149+
.isThrownBy(() -> validateRsqlForTestFields(rsql2));
128150

129151
final String rsql3 = "TESTFIELD == abcd or TESTFIELD_WITH_SUB_ENTITIES.unsupported == 0123";
130152
assertThatExceptionOfType(RSQLParameterUnsupportedFieldException.class)
131-
.isThrownBy(() -> RSQLUtility.validateRsqlFor(rsql3, TestFieldEnum.class));
153+
.isThrownBy(() -> validateRsqlForTestFields(rsql3));
132154
}
133155

134156
@Test
135157
@Description("Testing valid RSQL keys based on TestFieldEnum.class")
136158
public void rsqlFieldValidation() {
159+
137160
final String rsql1 = "TESTFIELD_WITH_SUB_ENTITIES.subentity11 == abcd and TESTFIELD_WITH_SUB_ENTITIES.subentity22 == 0123";
138161
final String rsql2 = "TESTFIELD_WITH_SUB_ENTITIES.subentity11 == abcd or TESTFIELD_WITH_SUB_ENTITIES.subentity22 == 0123";
139162
final String rsql3 = "TESTFIELD_WITH_SUB_ENTITIES.subentity11 == abcd and TESTFIELD_WITH_SUB_ENTITIES.subentity22 == 0123 and TESTFIELD == any";
140163

141-
RSQLUtility.validateRsqlFor(rsql1, TestFieldEnum.class);
142-
RSQLUtility.validateRsqlFor(rsql2, TestFieldEnum.class);
143-
RSQLUtility.validateRsqlFor(rsql3, TestFieldEnum.class);
164+
validateRsqlForTestFields(rsql1);
165+
validateRsqlForTestFields(rsql2);
166+
validateRsqlForTestFields(rsql3);
144167
}
145-
168+
146169
@Test
147170
@Description("Verify that RSQL expressions are validated case insensitive")
148171
public void mixedCaseRsqlFieldValidation() {
172+
when(rsqlVisitorFactory.validationRsqlVisitor(eq(TargetFields.class))).thenReturn(new FieldValidationRsqlVisitor<>(TargetFields.class));
149173
final String rsqlWithMixedCase = "name==b And name==c aND Name==d OR NAME=iN=y oR nAme=IN=z";
150174
RSQLUtility.validateRsqlFor(rsqlWithMixedCase, TargetFields.class);
151175
}
@@ -178,24 +202,24 @@ public void wrongFieldThrowUnsupportedFieldException() {
178202
public void wrongRsqlMapSyntaxThrowSyntaxException() {
179203
String wrongRSQL = TargetFields.ATTRIBUTE + "==abc";
180204
try {
181-
RSQLUtility.buildRsqlSpecification(wrongRSQL, TargetFields.class, null, testDb).toPredicate(baseSoftwareModuleRootMock,
182-
criteriaQueryMock, criteriaBuilderMock);
205+
RSQLUtility.buildRsqlSpecification(wrongRSQL, TargetFields.class, null, testDb)
206+
.toPredicate(baseSoftwareModuleRootMock, criteriaQueryMock, criteriaBuilderMock);
183207
fail("Missing expected RSQLParameterSyntaxException for target attributes map, caused by wrong RSQL syntax (key was not present)");
184208
} catch (final RSQLParameterUnsupportedFieldException e) {
185209
}
186210

187211
wrongRSQL = TargetFields.ATTRIBUTE + ".unknown.wrong==abc";
188212
try {
189-
RSQLUtility.buildRsqlSpecification(wrongRSQL, TargetFields.class, null, testDb).toPredicate(baseSoftwareModuleRootMock,
190-
criteriaQueryMock, criteriaBuilderMock);
213+
RSQLUtility.buildRsqlSpecification(wrongRSQL, TargetFields.class, null, testDb)
214+
.toPredicate(baseSoftwareModuleRootMock, criteriaQueryMock, criteriaBuilderMock);
191215
fail("Missing expected RSQLParameterSyntaxException for target attributes map, caused by wrong RSQL syntax (key includes dots)");
192216
} catch (final RSQLParameterUnsupportedFieldException e) {
193217
}
194218

195219
wrongRSQL = TargetFields.METADATA + ".unknown.wrong==abc";
196220
try {
197-
RSQLUtility.buildRsqlSpecification(wrongRSQL, TargetFields.class, null, testDb).toPredicate(baseSoftwareModuleRootMock,
198-
criteriaQueryMock, criteriaBuilderMock);
221+
RSQLUtility.buildRsqlSpecification(wrongRSQL, TargetFields.class, null, testDb)
222+
.toPredicate(baseSoftwareModuleRootMock, criteriaQueryMock, criteriaBuilderMock);
199223
fail("Missing expected RSQLParameterSyntaxException for target metadata map, caused by wrong RSQL syntax (key includes dots)");
200224
} catch (final RSQLParameterUnsupportedFieldException e) {
201225
}
@@ -214,24 +238,24 @@ public void wrongRsqlMapSyntaxThrowSyntaxException() {
214238
public void wrongRsqlSubEntitySyntaxThrowSyntaxException() {
215239
String wrongRSQL = TargetFields.ASSIGNEDDS + "==abc";
216240
try {
217-
RSQLUtility.buildRsqlSpecification(wrongRSQL, TargetFields.class, null, testDb).toPredicate(baseSoftwareModuleRootMock,
218-
criteriaQueryMock, criteriaBuilderMock);
241+
RSQLUtility.buildRsqlSpecification(wrongRSQL, TargetFields.class, null, testDb)
242+
.toPredicate(baseSoftwareModuleRootMock, criteriaQueryMock, criteriaBuilderMock);
219243
fail("Missing expected RSQLParameterSyntaxException because of wrong RSQL syntax");
220244
} catch (final RSQLParameterUnsupportedFieldException e) {
221245
}
222246

223247
wrongRSQL = TargetFields.ASSIGNEDDS + ".unknownField==abc";
224248
try {
225-
RSQLUtility.buildRsqlSpecification(wrongRSQL, TargetFields.class, null, testDb).toPredicate(baseSoftwareModuleRootMock,
226-
criteriaQueryMock, criteriaBuilderMock);
249+
RSQLUtility.buildRsqlSpecification(wrongRSQL, TargetFields.class, null, testDb)
250+
.toPredicate(baseSoftwareModuleRootMock, criteriaQueryMock, criteriaBuilderMock);
227251
fail("Missing expected RSQLParameterSyntaxException because of wrong RSQL syntax");
228252
} catch (final RSQLParameterUnsupportedFieldException e) {
229253
}
230254

231255
wrongRSQL = TargetFields.ASSIGNEDDS + ".unknownField.ToMuch==abc";
232256
try {
233-
RSQLUtility.buildRsqlSpecification(wrongRSQL, TargetFields.class, null, testDb).toPredicate(baseSoftwareModuleRootMock,
234-
criteriaQueryMock, criteriaBuilderMock);
257+
RSQLUtility.buildRsqlSpecification(wrongRSQL, TargetFields.class, null, testDb)
258+
.toPredicate(baseSoftwareModuleRootMock, criteriaQueryMock, criteriaBuilderMock);
235259
fail("Missing expected RSQLParameterSyntaxException because of wrong RSQL syntax");
236260
} catch (final RSQLParameterUnsupportedFieldException e) {
237261
}
@@ -250,8 +274,8 @@ public <T> void correctRsqlBuildsPredicate() {
250274
when(criteriaBuilderMock.equal(any(Expression.class), any(String.class))).thenReturn(mock(Predicate.class));
251275

252276
// test
253-
RSQLUtility.buildRsqlSpecification(correctRsql, SoftwareModuleFields.class, null, testDb).toPredicate(baseSoftwareModuleRootMock,
254-
criteriaQueryMock, criteriaBuilderMock);
277+
RSQLUtility.buildRsqlSpecification(correctRsql, SoftwareModuleFields.class, null, testDb)
278+
.toPredicate(baseSoftwareModuleRootMock, criteriaQueryMock, criteriaBuilderMock);
255279

256280
// verification
257281
verify(criteriaBuilderMock, times(1)).and(any(Predicate.class));
@@ -271,8 +295,8 @@ public void correctRsqlBuildsSimpleNotLikePredicate() {
271295
.thenReturn(pathOfString(baseSoftwareModuleRootMock));
272296

273297
// test
274-
RSQLUtility.buildRsqlSpecification(correctRsql, SoftwareModuleFields.class, null, testDb).toPredicate(baseSoftwareModuleRootMock,
275-
criteriaQueryMock, criteriaBuilderMock);
298+
RSQLUtility.buildRsqlSpecification(correctRsql, SoftwareModuleFields.class, null, testDb)
299+
.toPredicate(baseSoftwareModuleRootMock, criteriaQueryMock, criteriaBuilderMock);
276300

277301
// verification
278302
verify(criteriaBuilderMock, times(1)).or(any(Predicate.class), any(Predicate.class));
@@ -301,8 +325,8 @@ public void correctRsqlBuildsNotSimpleNotLikePredicate() {
301325
when(subqueryMock.select(subqueryRootMock)).thenReturn(subqueryMock);
302326

303327
// test
304-
RSQLUtility.buildRsqlSpecification(correctRsql, SoftwareModuleFields.class, null, testDb).toPredicate(baseSoftwareModuleRootMock,
305-
criteriaQueryMock, criteriaBuilderMock);
328+
RSQLUtility.buildRsqlSpecification(correctRsql, SoftwareModuleFields.class, null, testDb)
329+
.toPredicate(baseSoftwareModuleRootMock, criteriaQueryMock, criteriaBuilderMock);
306330

307331
// verification
308332
verify(criteriaBuilderMock, times(1)).not(criteriaBuilderMock.exists(eq(subqueryMock)));
@@ -361,8 +385,8 @@ public void correctRsqlBuildsLessThanPredicate() {
361385
when(criteriaBuilderMock.<String> greaterThanOrEqualTo(any(Expression.class), any(String.class)))
362386
.thenReturn(mock(Predicate.class));
363387
// test
364-
RSQLUtility.buildRsqlSpecification(correctRsql, SoftwareModuleFields.class, null, testDb).toPredicate(baseSoftwareModuleRootMock,
365-
criteriaQueryMock, criteriaBuilderMock);
388+
RSQLUtility.buildRsqlSpecification(correctRsql, SoftwareModuleFields.class, null, testDb)
389+
.toPredicate(baseSoftwareModuleRootMock, criteriaQueryMock, criteriaBuilderMock);
366390

367391
// verification
368392
verify(criteriaBuilderMock, times(1)).and(any(Predicate.class));
@@ -378,8 +402,8 @@ public void correctRsqlWithEnumValue() {
378402
when(criteriaBuilderMock.equal(any(Root.class), any(TestValueEnum.class))).thenReturn(mock(Predicate.class));
379403

380404
// test
381-
RSQLUtility.buildRsqlSpecification(correctRsql, TestFieldEnum.class, null, testDb).toPredicate(baseSoftwareModuleRootMock,
382-
criteriaQueryMock, criteriaBuilderMock);
405+
RSQLUtility.buildRsqlSpecification(correctRsql, TestFieldEnum.class, null, testDb)
406+
.toPredicate(baseSoftwareModuleRootMock, criteriaQueryMock, criteriaBuilderMock);
383407

384408
// verification
385409
verify(criteriaBuilderMock, times(1)).and(any(Predicate.class));
@@ -396,8 +420,8 @@ public void wrongRsqlWithWrongEnumValue() {
396420

397421
try {
398422
// test
399-
RSQLUtility.buildRsqlSpecification(correctRsql, TestFieldEnum.class, null, testDb).toPredicate(baseSoftwareModuleRootMock,
400-
criteriaQueryMock, criteriaBuilderMock);
423+
RSQLUtility.buildRsqlSpecification(correctRsql, TestFieldEnum.class, null, testDb)
424+
.toPredicate(baseSoftwareModuleRootMock, criteriaQueryMock, criteriaBuilderMock);
401425
fail("missing RSQLParameterUnsupportedFieldException for wrong enum value");
402426
} catch (final RSQLParameterUnsupportedFieldException e) {
403427
// nope expected
@@ -458,6 +482,8 @@ public void correctRsqlWithUnknownMacro() {
458482
}
459483

460484
public VirtualPropertyReplacer setupMacroLookup() {
485+
when(securityContext.runAsSystem(Mockito.any())).thenAnswer(a -> ((Callable<?>) a.getArgument(0)).call());
486+
461487
when(confMgmt.getConfigurationValue(TenantConfigurationKey.POLLING_TIME_INTERVAL, String.class))
462488
.thenReturn(TEST_POLLING_TIME_INTERVAL);
463489
when(confMgmt.getConfigurationValue(TenantConfigurationKey.POLLING_OVERDUE_TIME_INTERVAL, String.class))
@@ -475,7 +501,7 @@ private enum TestFieldEnum implements FieldNameProvider {
475501
TESTFIELD("testfield"), TESTFIELD_WITH_SUB_ENTITIES("testfieldWithSubEntities", "subentity11", "subentity22");
476502

477503
private final String fieldName;
478-
private List<String> subEntityAttributes;
504+
private final List<String> subEntityAttributes;
479505

480506
TestFieldEnum(final String fieldName) {
481507
this(fieldName, new String[0]);
@@ -497,6 +523,11 @@ public List<String> getSubEntityAttributes() {
497523
}
498524
}
499525

526+
private void validateRsqlForTestFields(final String rsql) {
527+
when(rsqlVisitorFactory.validationRsqlVisitor(eq(TestFieldEnum.class))).thenReturn(new FieldValidationRsqlVisitor<>(TestFieldEnum.class));
528+
RSQLUtility.validateRsqlFor(rsql, TestFieldEnum.class);
529+
}
530+
500531
private enum TestValueEnum {
501532
BUMLUX;
502533
}

0 commit comments

Comments
 (0)