Skip to content

Commit 6c3d7cd

Browse files
committed
Added in memory caching for test environments
1 parent 655f4a3 commit 6c3d7cd

15 files changed

Lines changed: 242 additions & 60 deletions

File tree

app/src/main/resources/application.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ spring.data.mongodb.uri=${GENUM_DATABASE_URI:""}
99
spring.data.mongodb.database=${GENUM_DATABASE:""}
1010

1111
spring.cache.type=redis
12+
spring.cache.redis.cache-null-values=false
13+
spring.cache.redis.enable-statistics=true
1214
spring.data.redis.url=${REDIS_DATABASE_URL:""}
1315
spring.data.redis.connect-timeout=60000
1416

@@ -57,5 +59,6 @@ auth.maxAttempts=5
5759
auth.lockoutDuration_minutes=30
5860

5961
# logging.level.org.springframework.security=debug
62+
logging.level.org.springframework.cache=trace
6063

6164

app/src/test/java/genum/app/genumUser/GenumUserIT.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ public class GenumUserIT extends BaseDatabaseIntegration {
9393
/* ========================================= ITest for user creation =============================================*/
9494

9595
@Test
96-
@Order(0)
9796
void shouldCreateUser() throws Exception {
9897

9998
this.mockMvc
@@ -104,8 +103,8 @@ void shouldCreateUser() throws Exception {
104103
}
105104

106105
@Test
107-
@Order(1)
108106
void shouldReturn409IfUserAlreadyExists() throws Exception {
107+
109108
mongoTemplate.save(userThatExists,"users");
110109
this.mockMvc
111110
.perform(post("/api/user/create")
@@ -127,15 +126,13 @@ void shouldReturn400IfInvalidUserCreationRequest() throws Exception {
127126
/* ========================================= ITest for getting waitingList =======================================*/
128127

129128
@Test
130-
@Order(0)
131129
void shouldReturnUnAuthorizedForUnAuthenticatedAndUnAuthorizedAttemptToGetWaitingLists() throws Exception {
132130
this.mockMvc
133131
.perform(get("/api/user/waiting-list"))
134132
.andExpect(status().isForbidden());
135133
}
136134

137135
@Test
138-
@Order(1)
139136
void shouldReturnOkOnAttemptToGetWaitingLists() throws Exception {
140137
this.mockMvc
141138
.perform(
@@ -148,7 +145,6 @@ void shouldReturnOkOnAttemptToGetWaitingLists() throws Exception {
148145
/* ========================================== ITest adding waiting list ==========================================*/
149146

150147
@Test
151-
@Order(2)
152148
void shouldAddToWaitListWithValidEmail() throws Exception {
153149
this.mockMvc
154150
.perform(
@@ -159,7 +155,6 @@ void shouldAddToWaitListWithValidEmail() throws Exception {
159155
}
160156

161157
@Test
162-
@Order(3)
163158
void shouldReturn400IfInvalidWaitingList() throws Exception {
164159
this.mockMvc
165160
.perform(post("/api/user/waiting-list")
@@ -168,7 +163,6 @@ void shouldReturn400IfInvalidWaitingList() throws Exception {
168163
).andExpect(status().isBadRequest());
169164
}
170165
@Test
171-
@Order(4)
172166
void shouldReturnConflictIfEmailAlreadyExists() throws Exception {
173167
mongoTemplate.save(waitingListEmailInDb, "wait_list");
174168
this.mockMvc

app/src/test/java/genum/app/learn/LearningIT.java

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import genum.shared.DTO.response.ResponseDetails;
1010
import genum.shared.constant.Gender;
1111
import genum.shared.security.CustomUserDetails;
12+
import lombok.extern.slf4j.Slf4j;
1213
import org.junit.jupiter.api.BeforeAll;
1314
import org.junit.jupiter.api.BeforeEach;
1415
import org.junit.jupiter.api.Test;
@@ -30,7 +31,6 @@
3031
import org.springframework.security.core.context.SecurityContextImpl;
3132
import org.springframework.test.web.servlet.MockMvc;
3233

33-
import java.io.IOException;
3434
import java.nio.charset.StandardCharsets;
3535
import java.time.LocalDateTime;
3636
import java.util.List;
@@ -45,6 +45,7 @@
4545
@SpringBootTest
4646
@AutoConfigureMockMvc(addFilters = false)
4747
@AutoConfigureJsonTesters
48+
@Slf4j
4849
public class LearningIT extends BaseDatabaseIntegration {
4950

5051
@Autowired
@@ -97,20 +98,22 @@ void shouldGetAllUsersUploadedCoursesIfAuthorized() throws Exception {
9798
userDetails.getUserReferenceId(),
9899
"Course Description",
99100
23000);
101+
existingCourse.setUploaderId(userDetails.getUserReferenceId());
100102

101103
existingCourse = mongoTemplate.save(existingCourse, "course");
102104

103105
mockMvc.perform(
104-
get("/api/learn/my-course")
106+
get("/api/learn/course/my-course")
105107
.with(user(userDetails))
106108
).andExpect(status().isOk());
107109

108-
mongoTemplate.remove(existingCourse, "course");
110+
var deleteResult = mongoTemplate.remove(existingCourse, "course");
111+
assertThat(deleteResult.wasAcknowledged()).isTrue();
109112
}
110113
@Test
111114
void shouldReturnUnauthorizedIfNotAuthorized() throws Exception {
112115
mockMvc.perform(
113-
get("/api/learn/my-course")
116+
get("/api/learn/course/my-course")
114117
).andExpect(status().isUnauthorized());
115118
}
116119

@@ -129,7 +132,8 @@ void givenExistingCourse_ShouldReturnCourse() throws Exception {
129132
get("/api/learn/course/%s".formatted(existingCourse.getReferenceId()))
130133
)
131134
.andExpect(status().isOk());
132-
mongoTemplate.remove(existingCourse);
135+
var deleteResult = mongoTemplate.remove(existingCourse, "course");
136+
assertThat(deleteResult.wasAcknowledged()).isTrue();
133137
}
134138
@Test
135139
void givenNonExistentCourse_ShouldReturnNotFound() throws Exception {
@@ -160,7 +164,8 @@ void givenExistingCourseAndUserIsEnrolled_ShouldReturnTrue() throws Exception {
160164
boolean isAuthorized = jacksonTesterForEnrolled.parseObject(result.getContentAsString(StandardCharsets.UTF_8)).getData();
161165

162166
assertThat(isAuthorized).isTrue();
163-
mongoTemplate.remove(existingCourse, "course");
167+
var deleteResult = mongoTemplate.remove(existingCourse, "course");
168+
assertThat(deleteResult.wasAcknowledged()).isTrue();
164169
}
165170
@Test
166171
void givenExistingCourseAndUserNotEnrolled_ShouldReturnFalse() throws Exception {
@@ -180,7 +185,8 @@ void givenExistingCourseAndUserNotEnrolled_ShouldReturnFalse() throws Exception
180185
boolean isAuthorized = jacksonTesterForEnrolled.parseObject(result.getContentAsString(StandardCharsets.UTF_8)).getData();
181186
assertThat(isAuthorized).isFalse();
182187

183-
mongoTemplate.remove(existingCourse, "course");
188+
var deleteResult = mongoTemplate.remove(existingCourse, "course");
189+
assertThat(deleteResult.wasAcknowledged()).isTrue();
184190
}
185191

186192
/* ===================================== Tests for creating course ============================================== */
@@ -257,8 +263,11 @@ void shouldGetLessonsPertainingToAParticularCourse() throws Exception {
257263
assertThat(jsonResult.getData().content().isEmpty()).isFalse();
258264
assertThat(jsonResult.getData().content().size()).isEqualTo(3);
259265

260-
mongoTemplate.remove(Query.query(Criteria.where("courseId").is(existingCourse.getReferenceId())),"lesson");
261-
mongoTemplate.remove(existingCourse,"course");
266+
var deleteResultForLesson = mongoTemplate.remove(Query.query(Criteria.where("courseId").is(existingCourse.getReferenceId())),"lesson");
267+
var deleteResult = mongoTemplate.remove(existingCourse, "course");
268+
assertThat(deleteResult.wasAcknowledged()).isTrue();
269+
assertThat(deleteResultForLesson.wasAcknowledged()).isTrue();
270+
262271
}
263272

264273
/* =========================================== Test for getting lesson by lessonId ============================== */
@@ -286,7 +295,8 @@ void shouldGetLessonByTheLessonId() throws Exception {
286295
assertThat(existingLesson.getTitle()).isEqualTo(responseData.title());
287296
assertThat(existingLesson.getReferenceId()).isEqualTo(responseData.lessonId());
288297

289-
mongoTemplate.remove(existingLesson, "lesson");
298+
var deleteResult = mongoTemplate.remove(existingLesson, "lesson");
299+
assertThat(deleteResult.wasAcknowledged()).isTrue();
290300

291301
}
292302

@@ -334,7 +344,8 @@ void shouldUploadLesson_GivenAValidRequest() throws Exception{
334344
assertThat(response.title()).isEqualTo(lessonUploadRequest.title());
335345

336346

337-
mongoTemplate.remove(existingCourse,"course");
347+
var deleteResult = mongoTemplate.remove(existingCourse, "course");
348+
assertThat(deleteResult.wasAcknowledged()).isTrue();
338349

339350
}
340351

@@ -359,9 +370,10 @@ void shouldReturn400ForAnInValidRequest() throws Exception{
359370
.contentType(MediaType.APPLICATION_JSON)
360371
.content(jsonLessonUploadRequest.write(lessonUploadRequest).getJson())
361372
)
362-
.andExpect(status().isCreated());
373+
.andExpect(status().isBadRequest());
363374

364-
mongoTemplate.remove(existingCourse,"course");
375+
var deleteResult = mongoTemplate.remove(existingCourse, "course");
376+
assertThat(deleteResult.wasAcknowledged()).isTrue();
365377

366378
}
367379

@@ -424,8 +436,11 @@ void givenExistingCourseAndLesson_ShouldUpdateLesson () throws Exception {
424436
assertThat(existingLesson.getReferenceId()).isEqualTo(response.lessonId());
425437

426438

427-
mongoTemplate.remove(existingCourse, "course");
428-
mongoTemplate.remove(existingLesson, "lesson");
439+
var deleteCourseResult = mongoTemplate.remove(existingCourse, "course");
440+
assertThat(deleteCourseResult.wasAcknowledged()).isTrue();
441+
442+
var deleteLessonResult = mongoTemplate.remove(existingLesson, "lesson");
443+
assertThat(deleteLessonResult.wasAcknowledged()).isTrue();
429444

430445

431446
}
@@ -465,8 +480,10 @@ void givenExistingCourseAndLessonButWithEmptyOrBlankRequestFields_ShouldNotUpdat
465480
assertThat(existingLesson.getReferenceId()).isEqualTo(response.lessonId());
466481

467482

468-
mongoTemplate.remove(existingCourse, "course");
469-
mongoTemplate.remove(existingLesson, "lesson");
483+
var deleteCourseResult = mongoTemplate.remove(existingCourse, "course");
484+
assertThat(deleteCourseResult.wasAcknowledged()).isTrue();
485+
var deleteLessonResult = mongoTemplate.remove(existingLesson, "lesson");
486+
assertThat(deleteLessonResult.wasAcknowledged()).isTrue();
470487

471488

472489
}
@@ -519,8 +536,10 @@ void shouldUploadVideoForAParticularLesson() throws Exception{
519536
).andExpect(status().isCreated());
520537

521538

522-
mongoTemplate.remove(existingCourse, "course");
523-
mongoTemplate.remove(existingLesson, "lesson");
539+
var deleteCourseResult = mongoTemplate.remove(existingCourse, "course");
540+
assertThat(deleteCourseResult.wasAcknowledged()).isTrue();
541+
var deleteLessonResult = mongoTemplate.remove(existingLesson, "lesson");
542+
assertThat(deleteLessonResult.wasAcknowledged()).isTrue();
524543

525544
}
526545

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package genum.app.shared;
22

33
import com.redis.testcontainers.RedisContainer;
4-
import org.junit.jupiter.api.AfterAll;
5-
import org.junit.jupiter.api.BeforeAll;
6-
import org.junit.jupiter.api.TestInstance;
74
import org.springframework.test.context.DynamicPropertyRegistry;
85
import org.springframework.test.context.DynamicPropertySource;
96
import org.testcontainers.containers.MongoDBContainer;
@@ -17,21 +14,21 @@ public abstract class BaseDatabaseIntegration {
1714
@Container
1815
static MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:8.0.0-rc20")
1916
.withCommand("mongod","--replSet" ,"rs0", "--bind_ip_all");
20-
@Container
21-
static RedisContainer redisContainer = new RedisContainer(DockerImageName.parse("redis:8.0-M03-alpine"))
22-
.withExposedPorts(6379);
17+
// @Container
18+
// static RedisContainer redisContainer = new RedisContainer(DockerImageName.parse("redis:8.0-M03-alpine"))
19+
// .withExposedPorts(6379);
2320

2421
@DynamicPropertySource
2522
static void configureProperties(DynamicPropertyRegistry registry) {
2623

2724
registry.add("spring.data.mongodb.uri", mongoDBContainer::getReplicaSetUrl);
28-
registry.add("spring.redis.host",redisContainer::getHost);
29-
registry.add("spring.redis.port", () -> redisContainer.getMappedPort(6379).toString());
25+
// registry.add("spring.redis.host",redisContainer::getHost);
26+
// registry.add("spring.redis.port", () -> redisContainer.getMappedPort(6379).toString());
3027
}
3128

3229
static {
3330
mongoDBContainer.start();
3431

35-
redisContainer.start();
32+
// redisContainer.start();
3633
}
3734
}

course/src/main/java/genum/course/repository/CourseRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ public interface CourseRepository extends MongoRepository<Course, String>, Cours
1313

1414
Optional<Course> findByReferenceId(String referenceId);
1515
Page<Course> findAllByUploaderId(String uploaderId, Pageable pageable);
16+
boolean existsByReferenceId(String courseId);
1617

1718
}

course/src/main/java/genum/course/service/CourseService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ public CourseDTO updateProductPrice(String courseReferenceId, int newPrice) {
6464
return course.toDTO();
6565
}
6666

67+
public boolean existsByCourseId(String courseId) {
68+
return courseRepository.existsByReferenceId(courseId);
69+
}
70+
6771

6872

6973
}

genumUser/src/main/java/genum/genumUser/config/UserWebSecurityConfiguration.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import genum.genumUser.security.jwt.JWTAuthorizationFilter;
99
import genum.genumUser.security.jwt.JwtUtils;
1010
import genum.genumUser.security.jwt.LogoutHandlingFilter;
11+
import genum.shared.util.CacheService;
1112
import jakarta.servlet.http.HttpServletResponse;
1213
import lombok.RequiredArgsConstructor;
1314
import lombok.extern.slf4j.Slf4j;
@@ -133,8 +134,8 @@ public UserDetailsService userDetailsService(GenumUserRepository userRepository)
133134

134135

135136
@Bean
136-
public DaoAuthenticationProvider authenticationProvider(PasswordEncoder passwordEncoder, RedisTemplate<String, Object> redisTemplate, UserDetailsService userDetailsService) {
137-
var genumAuthProvider = new GenumAuthenticationProvider(passwordEncoder, redisTemplate);
137+
public DaoAuthenticationProvider authenticationProvider(PasswordEncoder passwordEncoder,UserDetailsService userDetailsService, CacheService<String, Object> cacheService) {
138+
var genumAuthProvider = new GenumAuthenticationProvider(passwordEncoder, cacheService);
138139
genumAuthProvider.setUserDetailsService(userDetailsService);
139140
return genumAuthProvider;
140141
}

0 commit comments

Comments
 (0)