Skip to content

Commit 39c0c3e

Browse files
authored
Merge pull request #73 from EMResearch/issues-mongo
Issues mongo
2 parents e559c57 + 29ebe62 commit 39c0c3e

File tree

2 files changed

+163
-18
lines changed

2 files changed

+163
-18
lines changed

jdk_11_gradle/em/embedded/rest/reservations-api/src/main/java/em/embedded/reservationsapi/EmbeddedEvoMasterController.java

Lines changed: 87 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@
22

33
import com.mongodb.client.MongoClient;
44
import com.mongodb.client.MongoClients;
5+
import com.mongodb.client.MongoCollection;
6+
import org.bson.Document;
7+
import org.bson.types.ObjectId;
58
import org.evomaster.client.java.controller.EmbeddedSutController;
69
import org.evomaster.client.java.controller.InstrumentedSutStarter;
710
import org.evomaster.client.java.controller.api.dto.AuthenticationDto;
11+
import org.evomaster.client.java.controller.api.dto.JsonTokenPostLoginDto;
812
import org.evomaster.client.java.controller.api.dto.SutInfoDto;
913
import org.evomaster.client.java.sql.DbSpecification;
1014
import org.evomaster.client.java.controller.problem.ProblemInfo;
@@ -14,6 +18,7 @@
1418
import org.testcontainers.containers.GenericContainer;
1519
import sk.cyrilgavala.reservationsApi.ReservationsApi;
1620

21+
import java.util.Arrays;
1722
import java.util.Collections;
1823
import java.util.List;
1924
import java.util.Map;
@@ -45,12 +50,22 @@ public static void main(String[] args) {
4550
//https://www.mongodb.com/docs/drivers/java/sync/current/compatibility/
4651
private static final String MONGODB_VERSION = "4.4";
4752

48-
private static final String MONGODB_DATABASE_NAME = "Reservations";
53+
private static final String MONGODB_DATABASE_NAME = "reservations-api";
4954

50-
private static final GenericContainer mongodbContainer = new GenericContainer("mongo:" + MONGODB_VERSION)
51-
.withTmpFs(Collections.singletonMap("/data/db", "rw"))
55+
// docker run -p 27017:27017 -e MONGODB_REPLICA_SET_MODE=primary -e ALLOW_EMPTY_PASSWORD=yes bitnami/mongodb:4.4
56+
// https://hub.docker.com/r/bitnami/mongodb
57+
// cannot use standard Mongo image, due ridiculous handling of transaction that requires a cluster...
58+
59+
private static final GenericContainer mongodbContainer = new GenericContainer("bitnami/mongodb:" + MONGODB_VERSION)
60+
.withTmpFs(Collections.singletonMap("/bitnami/mongodb", "rw"))
61+
.withEnv("MONGODB_REPLICA_SET_MODE", "primary")
62+
.withEnv("ALLOW_EMPTY_PASSWORD", "yes")
5263
.withExposedPorts(MONGODB_PORT);
5364

65+
66+
private static final String rawPassword = "bar123";
67+
private static final String hashedPassword = "$2a$10$nEDY5j731yXGnQHyM39PWurJWr1FukegmKYYarK5WOoAMmgDs6D3u";
68+
5469
private String mongoDbUrl;
5570

5671
private MongoClient mongoClient;
@@ -71,13 +86,12 @@ public String startSut() {
7186
mongoDbUrl = "mongodb://" + mongodbContainer.getContainerIpAddress() + ":" + mongodbContainer.getMappedPort(MONGODB_PORT) + "/" + MONGODB_DATABASE_NAME;
7287
mongoClient = MongoClients.create(mongoDbUrl);
7388

74-
75-
7689
ctx = SpringApplication.run(ReservationsApi.class,
7790
new String[]{"--server.port=0",
78-
"--databaseUrl="+mongoDbUrl,
79-
"--spring.data.mongodb.uri="+mongoDbUrl,
80-
"--spring.cache.type=NONE"
91+
"--databaseUrl=" + mongoDbUrl,
92+
"--spring.data.mongodb.uri=" + mongoDbUrl,
93+
"--spring.cache.type=NONE",
94+
"--app.jwt.secret=abcdef012345678901234567890123456789abcdef012345678901234567890123456789"
8195
});
8296

8397
return "http://localhost:" + getSutPort();
@@ -111,6 +125,35 @@ public String getPackagePrefixesToCover() {
111125
@Override
112126
public void resetStateOfSUT() {
113127
mongoClient.getDatabase(MONGODB_DATABASE_NAME).drop();
128+
129+
mongoClient.getDatabase(MONGODB_DATABASE_NAME).createCollection("users");
130+
131+
MongoCollection<Document> users = mongoClient.getDatabase(MONGODB_DATABASE_NAME).getCollection("users");
132+
users.insertMany(Arrays.asList(
133+
new Document()
134+
.append("_id", new ObjectId())
135+
.append("_class", "sk.cyrilgavala.reservationsApi.model.User")
136+
.append("username", "foo")
137+
.append("email", "foo@foo.com")
138+
.append("password", hashedPassword)
139+
.append("role", "USER"),
140+
new Document()
141+
.append("_id", new ObjectId())
142+
.append("_class", "sk.cyrilgavala.reservationsApi.model.User")
143+
.append("username", "bar")
144+
.append("email", "bar@foo.com")
145+
.append("password", hashedPassword)
146+
.append("role", "USER"),
147+
new Document()
148+
.append("_id", new ObjectId())
149+
.append("_class", "sk.cyrilgavala.reservationsApi.model.User")
150+
.append("username", "admin")
151+
.append("email", "admin@foo.com")
152+
.append("password", hashedPassword)
153+
.append("role", "ADMIN")
154+
));
155+
156+
114157
}
115158

116159
@Override
@@ -121,11 +164,40 @@ public List<DbSpecification> getDbSpecifications() {
121164

122165
@Override
123166
public List<AuthenticationDto> getInfoForAuthentication() {
124-
//TODO might need to setup JWT headers here
125-
return null;
126-
}
127-
128167

168+
return Arrays.asList(
169+
new AuthenticationDto() {{
170+
name = "admin";
171+
jsonTokenPostLogin = new JsonTokenPostLoginDto() {{
172+
userId = "admin";
173+
endpoint = "/api/user/login";
174+
jsonPayload = "{\"username\":\"admin\", \"password\":\""+rawPassword+"\"}";
175+
extractTokenField = "/accessToken";
176+
headerPrefix = "Bearer ";
177+
}};
178+
}},
179+
new AuthenticationDto() {{
180+
name = "foo";
181+
jsonTokenPostLogin = new JsonTokenPostLoginDto() {{
182+
userId = "foo";
183+
endpoint = "/api/user/login";
184+
jsonPayload = "{\"username\":\"foo\", \"password\":\""+rawPassword+"\"}";
185+
extractTokenField = "/accessToken";
186+
headerPrefix = "Bearer ";
187+
}};
188+
}},
189+
new AuthenticationDto() {{
190+
name = "bar";
191+
jsonTokenPostLogin = new JsonTokenPostLoginDto() {{
192+
userId = "bar";
193+
endpoint = "/api/user/login";
194+
jsonPayload = "{\"username\":\"bar\", \"password\":\""+rawPassword+"\"}";
195+
extractTokenField = "/accessToken";
196+
headerPrefix = "Bearer ";
197+
}};
198+
}}
199+
);
200+
}
129201

130202

131203
@Override
@@ -142,6 +214,8 @@ public SutInfoDto.OutputFormat getPreferredOutputFormat() {
142214
}
143215

144216
@Override
145-
public Object getMongoConnection() {return mongoClient;}
217+
public Object getMongoConnection() {
218+
return mongoClient;
219+
}
146220

147221
}

jdk_11_gradle/em/external/rest/reservations-api/src/main/java/em/external/reservationsapi/ExternalEvoMasterController.java

Lines changed: 76 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,20 @@
22

33
import com.mongodb.client.MongoClient;
44
import com.mongodb.client.MongoClients;
5+
import com.mongodb.client.MongoCollection;
6+
import org.bson.Document;
7+
import org.bson.types.ObjectId;
58
import org.evomaster.client.java.controller.ExternalSutController;
69
import org.evomaster.client.java.controller.InstrumentedSutStarter;
710
import org.evomaster.client.java.controller.api.dto.AuthenticationDto;
11+
import org.evomaster.client.java.controller.api.dto.JsonTokenPostLoginDto;
812
import org.evomaster.client.java.controller.api.dto.SutInfoDto;
913
import org.evomaster.client.java.sql.DbSpecification;
1014
import org.evomaster.client.java.controller.problem.ProblemInfo;
1115
import org.evomaster.client.java.controller.problem.RestProblem;
1216
import org.testcontainers.containers.GenericContainer;
1317

18+
import java.util.Arrays;
1419
import java.util.Collections;
1520
import java.util.List;
1621

@@ -61,12 +66,17 @@ public static void main(String[] args) {
6166
//https://www.mongodb.com/docs/drivers/java/sync/current/compatibility/
6267
private static final String MONGODB_VERSION = "4.4";
6368

64-
private static final String MONGODB_DATABASE_NAME = "Reservations";
69+
private static final String MONGODB_DATABASE_NAME = "reservations-api";
6570

66-
private static final GenericContainer mongodbContainer = new GenericContainer("mongo:" + MONGODB_VERSION)
67-
.withTmpFs(Collections.singletonMap("/data/db", "rw"))
71+
private static final GenericContainer mongodbContainer = new GenericContainer("bitnami/mongodb:" + MONGODB_VERSION)
72+
.withTmpFs(Collections.singletonMap("/bitnami/mongodb", "rw"))
73+
.withEnv("MONGODB_REPLICA_SET_MODE", "primary")
74+
.withEnv("ALLOW_EMPTY_PASSWORD", "yes")
6875
.withExposedPorts(MONGODB_PORT);
6976

77+
private static final String rawPassword = "bar123";
78+
private static final String hashedPassword = "$2a$10$nEDY5j731yXGnQHyM39PWurJWr1FukegmKYYarK5WOoAMmgDs6D3u";
79+
7080
private String mongoDbUrl;
7181

7282
private MongoClient mongoClient;
@@ -103,7 +113,8 @@ public String[] getInputParameters() {
103113
return new String[]{
104114
"--server.port=" + sutPort,
105115
"--databaseUrl="+mongoDbUrl,
106-
"--spring.data.mongodb.uri="+mongoDbUrl
116+
"--spring.data.mongodb.uri="+mongoDbUrl,
117+
"--app.jwt.secret=abcdef012345678901234567890123456789abcdef012345678901234567890123456789"
107118
};
108119
}
109120

@@ -145,6 +156,34 @@ public void postStart() {
145156
@Override
146157
public void resetStateOfSUT() {
147158
mongoClient.getDatabase(MONGODB_DATABASE_NAME).drop();
159+
160+
mongoClient.getDatabase(MONGODB_DATABASE_NAME).createCollection("users");
161+
162+
MongoCollection<Document> users = mongoClient.getDatabase(MONGODB_DATABASE_NAME).getCollection("users");
163+
users.insertMany(Arrays.asList(
164+
new Document()
165+
.append("_id", new ObjectId())
166+
.append("_class", "sk.cyrilgavala.reservationsApi.model.User")
167+
.append("username", "foo")
168+
.append("email", "foo@foo.com")
169+
.append("password", hashedPassword)
170+
.append("role", "USER"),
171+
new Document()
172+
.append("_id", new ObjectId())
173+
.append("_class", "sk.cyrilgavala.reservationsApi.model.User")
174+
.append("username", "bar")
175+
.append("email", "bar@foo.com")
176+
.append("password", hashedPassword)
177+
.append("role", "USER"),
178+
new Document()
179+
.append("_id", new ObjectId())
180+
.append("_class", "sk.cyrilgavala.reservationsApi.model.User")
181+
.append("username", "admin")
182+
.append("email", "admin@foo.com")
183+
.append("password", hashedPassword)
184+
.append("role", "ADMIN")
185+
));
186+
148187
}
149188

150189
@Override
@@ -180,7 +219,39 @@ public SutInfoDto.OutputFormat getPreferredOutputFormat() {
180219

181220
@Override
182221
public List<AuthenticationDto> getInfoForAuthentication() {
183-
return null;
222+
223+
return Arrays.asList(
224+
new AuthenticationDto() {{
225+
name = "admin";
226+
jsonTokenPostLogin = new JsonTokenPostLoginDto() {{
227+
userId = "admin";
228+
endpoint = "/api/user/login";
229+
jsonPayload = "{\"username\":\"admin\", \"password\":\""+rawPassword+"\"}";
230+
extractTokenField = "/accessToken";
231+
headerPrefix = "Bearer ";
232+
}};
233+
}},
234+
new AuthenticationDto() {{
235+
name = "foo";
236+
jsonTokenPostLogin = new JsonTokenPostLoginDto() {{
237+
userId = "foo";
238+
endpoint = "/api/user/login";
239+
jsonPayload = "{\"username\":\"foo\", \"password\":\""+rawPassword+"\"}";
240+
extractTokenField = "/accessToken";
241+
headerPrefix = "Bearer ";
242+
}};
243+
}},
244+
new AuthenticationDto() {{
245+
name = "bar";
246+
jsonTokenPostLogin = new JsonTokenPostLoginDto() {{
247+
userId = "bar";
248+
endpoint = "/api/user/login";
249+
jsonPayload = "{\"username\":\"bar\", \"password\":\""+rawPassword+"\"}";
250+
extractTokenField = "/accessToken";
251+
headerPrefix = "Bearer ";
252+
}};
253+
}}
254+
);
184255
}
185256

186257
@Override

0 commit comments

Comments
 (0)