-
Notifications
You must be signed in to change notification settings - Fork 16
/
MasterHouseServiceTest.java
139 lines (113 loc) · 5.04 KB
/
MasterHouseServiceTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package com.behl.cachetropolis.service;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import java.util.List;
import java.util.UUID;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.cache.CacheManager;
import com.behl.cachetropolis.InitializeMysqlContainer;
import com.behl.cachetropolis.InitializeRedisContainer;
import com.behl.cachetropolis.dto.HouseDto;
import com.behl.cachetropolis.dto.WizardDto;
import com.behl.cachetropolis.entity.Wizard;
import com.behl.cachetropolis.exception.InvalidHouseIdException;
import com.behl.cachetropolis.repository.MasterHouseRepository;
import com.behl.cachetropolis.repository.WizardRepository;
import junit.framework.AssertionFailedError;
import net.bytebuddy.utility.RandomString;
@SpringBootTest
@InitializeMysqlContainer
@InitializeRedisContainer
class MasterHouseServiceTest {
@Autowired
private MasterHouseService masterHouseService;
@SpyBean
private WizardRepository wizardRepository;
@SpyBean
private MasterHouseRepository masterHouseRepository;
@Autowired
private CacheManager listCacheManager;
@Test
void shouldRetrieveWizardsAgainstValidHouseId() {
// fetch random house record from datasource
final var house = masterHouseRepository.fetchRandom().orElseThrow(AssertionFailedError::new);
// create wizard record
final var firstName = RandomString.make();
final var lastName = RandomString.make();
final var wizard = new Wizard();
wizard.setFirstName(firstName);
wizard.setLastName(lastName);
wizard.setGender("Male");
wizard.setHouseId(house.getId());
wizardRepository.save(wizard);
// invoke method under test
final List<WizardDto> retrievedWizards = masterHouseService.retrieveWizardsByHouseId(house.getId());
// assert presence of saved wizard in retrieved records and verify datasource interaction
assertThat(retrievedWizards).isNotNull().isNotEmpty();
assertThat(retrievedWizards).map(WizardDto::getFirstName).contains(firstName);
assertThat(retrievedWizards).map(WizardDto::getLastName).contains(lastName);
verify(wizardRepository, times(1)).findByHouseId(house.getId());
}
@Test
void shouldRetrieveWizardRecordsByHouseIdFromCacheAfterInitialDatabaseRetrieval() {
// fetch random house record from datasource
final var house = masterHouseRepository.fetchRandom().orElseThrow(AssertionFailedError::new);
final var houseId = house.getId();
// create wizard record
final var firstName = RandomString.make();
final var lastName = RandomString.make();
final var wizard = new Wizard();
wizard.setFirstName(firstName);
wizard.setLastName(lastName);
wizard.setGender("Male");
wizard.setHouseId(houseId);
wizardRepository.save(wizard);
// assert cache does not contain wizard records corresponding to house-id
var cachedWizardRecords = listCacheManager.getCache("wizards").get(houseId);
assertThat(cachedWizardRecords).isNull();
// invoke method under test and assert that initial retrieval is done from datasource
masterHouseService.retrieveWizardsByHouseId(houseId);
verify(wizardRepository, times(1)).findByHouseId(houseId);
Mockito.clearInvocations(wizardRepository);
// invoke method under test multiple times to verify subsequent reads are made from cache and datasource is not queried
final var queryTimes = 100;
for (int i = 1; i < queryTimes; i++) {
masterHouseService.retrieveWizardsByHouseId(houseId);
}
verify(wizardRepository, times(0)).findByHouseId(houseId);
}
@Test
void shouldThrowExceptionForInvalidHouseId() {
// prepare invalid house-id
final var houseId = UUID.randomUUID();
// invoke method under test and verify datasource interaction
assertThrows(InvalidHouseIdException.class, () -> masterHouseService.retrieveWizardsByHouseId(houseId));
verify(wizardRepository, times(1)).findByHouseId(houseId);
}
@Test
void shouldReturnNonEmptyHouseListPostFlywayMigrationExecution() {
// Retrieve the list of house records saved in the datasource
final var retrievedHouses = masterHouseService.retrieve();
// Verify that the list of countries is not empty and flyway migration script is executed
assertThat(retrievedHouses).isNotNull().isNotEmpty().hasSizeGreaterThanOrEqualTo(4);
assertThat(retrievedHouses).map(HouseDto::getId).doesNotContainNull();
assertThat(retrievedHouses).map(HouseDto::getName).doesNotContainNull();
}
@Test
void shouldFetchRandomHouseRecordFromDataSource() {
// invoke method under test
final var retrievedHouse = masterHouseService.retrieveRandom();
// assert response attributes
assertThat(retrievedHouse).isNotNull().isInstanceOf(HouseDto.class)
.satisfies(house -> {
assertThat(house.getId()).isNotNull();
assertThat(house.getName()).isNotNull();
});
}
}