Mercurial > malikania
comparison tests/libserver/db/account/main.cpp @ 116:d7025649d85c
Server: add database account
Implement accounts using a abstract factory mechanism, the database object
creates abstract account which are implemented differently depending on the
backend.
See:
- test_database,
- test_account
- broken_account
Refs #687, #682
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 11 Sep 2017 13:18:43 +0200 |
parents | 90c51ffdbbce |
children | a8bddc9566b0 |
comparison
equal
deleted
inserted
replaced
115:07cb0d9f92e9 | 116:d7025649d85c |
---|---|
19 #define BOOST_TEST_MODULE "database account" | 19 #define BOOST_TEST_MODULE "database account" |
20 #include <boost/test/unit_test.hpp> | 20 #include <boost/test/unit_test.hpp> |
21 | 21 |
22 #include <malikania/server/db/test_database.hpp> | 22 #include <malikania/server/db/test_database.hpp> |
23 #include <malikania/server/db/broken_account.hpp> | 23 #include <malikania/server/db/broken_account.hpp> |
24 #include <malikania/server/db/broken_character.hpp> | |
24 | 25 |
25 namespace mlk { | 26 namespace mlk { |
26 | 27 |
27 namespace server { | 28 namespace server { |
28 | 29 |
29 class account_fixture { | 30 class account_fixture { |
30 protected: | 31 protected: |
31 std::shared_ptr<test_database> db_{new test_database}; | 32 std::shared_ptr<test_database> db_{new test_database}; |
33 | |
34 inline const std::unordered_map<std::int64_t, nlohmann::json> accounts() const noexcept | |
35 { | |
36 return db_->test_account_dao().accounts(); | |
37 } | |
38 | |
39 inline std::unordered_map<std::int64_t, nlohmann::json> accounts() noexcept | |
40 { | |
41 return db_->test_account_dao().accounts(); | |
42 } | |
43 | |
44 inline const std::unordered_map<std::int64_t, nlohmann::json> characters() const noexcept | |
45 { | |
46 return db_->test_character_dao().characters(); | |
47 } | |
48 | |
49 inline std::unordered_map<std::int64_t, nlohmann::json> characters() noexcept | |
50 { | |
51 return db_->test_character_dao().characters(); | |
52 } | |
53 | |
54 const nlohmann::json& get(std::int64_t id) const noexcept | |
55 { | |
56 return db_->test_account_dao().accounts().at(id); | |
57 } | |
32 }; | 58 }; |
33 | 59 |
60 /* | |
61 * Basic suite using test database. | |
62 * ------------------------------------------------------------------ | |
63 */ | |
64 | |
34 BOOST_FIXTURE_TEST_SUITE(basic_suite, account_fixture) | 65 BOOST_FIXTURE_TEST_SUITE(basic_suite, account_fixture) |
35 | 66 |
67 /* | |
68 * account::save. | |
69 * ------------------------------------------------------------------ | |
70 * | |
71 * Verify that database is untouched during all operation on a draft account. | |
72 */ | |
36 BOOST_AUTO_TEST_CASE(save) | 73 BOOST_AUTO_TEST_CASE(save) |
37 { | 74 { |
38 auto acc = db_->account_draft("nanahara", "dummypassword"); | 75 auto acc = db_->account_draft("nanahara", "dummypassword"); |
39 | 76 |
40 // Initial creation must be draft. | 77 // Initial creation must be draft. |
51 BOOST_TEST(acc->is_draft()); | 88 BOOST_TEST(acc->is_draft()); |
52 BOOST_TEST(!acc->is_published()); | 89 BOOST_TEST(!acc->is_published()); |
53 BOOST_TEST(acc->email() == "nanahara@malikania.fr"); | 90 BOOST_TEST(acc->email() == "nanahara@malikania.fr"); |
54 BOOST_TEST(acc->firstname() == "Alexis"); | 91 BOOST_TEST(acc->firstname() == "Alexis"); |
55 BOOST_TEST(acc->lastname() == "Dörr"); | 92 BOOST_TEST(acc->lastname() == "Dörr"); |
56 BOOST_TEST(db_->test_account_dao()->accounts().size() == 0U); | 93 BOOST_TEST(accounts().size() == 0U); |
57 | 94 |
58 // Do save, database must be updated and account published. | 95 // Do save, database must be updated and account published. |
59 acc->save(); | 96 acc->save(); |
60 | 97 |
61 BOOST_TEST(!acc->is_draft()); | 98 BOOST_TEST(!acc->is_draft()); |
62 BOOST_TEST(acc->is_published()); | 99 BOOST_TEST(acc->is_published()); |
63 BOOST_TEST(acc->email() == "nanahara@malikania.fr"); | 100 BOOST_TEST(acc->email() == "nanahara@malikania.fr"); |
64 BOOST_TEST(acc->firstname() == "Alexis"); | 101 BOOST_TEST(acc->firstname() == "Alexis"); |
65 BOOST_TEST(acc->lastname() == "Dörr"); | 102 BOOST_TEST(acc->lastname() == "Dörr"); |
66 BOOST_TEST(db_->test_account_dao()->accounts().size() == 1U); | 103 BOOST_TEST(accounts().size() == 1U); |
67 } | 104 } |
68 | 105 |
106 /* | |
107 * account::set_password. | |
108 * ------------------------------------------------------------------ | |
109 */ | |
69 BOOST_AUTO_TEST_CASE(set_password) | 110 BOOST_AUTO_TEST_CASE(set_password) |
70 { | 111 { |
71 auto ac = db_->account_draft("markand", "nopassword"); | 112 auto ac = db_->account_draft("markand", "nopassword"); |
72 | 113 |
73 ac->set_password("temporarypassword"); | 114 ac->set_password("temporarypassword"); |
74 | |
75 BOOST_TEST(db_->test_account_dao()->accounts().size() == 0U); | |
76 | |
77 ac->save(); | 115 ac->save(); |
78 ac->set_password("newpassword"); | 116 ac->set_password("newpassword"); |
79 | 117 |
80 BOOST_TEST(db_->test_account_dao()->accounts().at(ac->id()).password() == "newpassword"); | 118 BOOST_TEST(get(ac->id())["password"].get<std::string>() == "newpassword"); |
81 } | 119 } |
82 | 120 |
121 /* | |
122 * account::set_email. | |
123 * ------------------------------------------------------------------ | |
124 */ | |
83 BOOST_AUTO_TEST_CASE(set_email) | 125 BOOST_AUTO_TEST_CASE(set_email) |
84 { | 126 { |
85 auto ac = db_->account_draft("markand", "nopassword"); | 127 auto ac = db_->account_draft("markand", "nopassword"); |
86 | 128 |
87 ac->set_email("fake@malikania.fr"); | 129 ac->set_email("fake@malikania.fr"); |
88 | |
89 BOOST_TEST(db_->test_account_dao()->accounts().size() == 0U); | |
90 | |
91 ac->save(); | 130 ac->save(); |
92 ac->set_email("markand@malikania.fr"); | 131 ac->set_email("markand@malikania.fr"); |
93 | 132 |
94 BOOST_TEST(db_->test_account_dao()->accounts().at(ac->id()).email() == "markand@malikania.fr"); | 133 BOOST_TEST(get(ac->id())["email"].get<std::string>() == "markand@malikania.fr"); |
95 } | 134 } |
96 | 135 |
136 /* | |
137 * account::set_firstname. | |
138 * ------------------------------------------------------------------ | |
139 */ | |
97 BOOST_AUTO_TEST_CASE(set_firstname) | 140 BOOST_AUTO_TEST_CASE(set_firstname) |
98 { | 141 { |
99 auto ac = db_->account_draft("markand", "nopassword"); | 142 auto ac = db_->account_draft("markand", "nopassword"); |
100 | 143 |
101 ac->set_firstname("Jean"); | 144 ac->set_firstname("Jean"); |
102 | |
103 BOOST_TEST(db_->test_account_dao()->accounts().size() == 0U); | |
104 | |
105 ac->save(); | 145 ac->save(); |
106 ac->set_firstname("David"); | 146 ac->set_firstname("David"); |
107 | 147 |
108 BOOST_TEST(db_->test_account_dao()->accounts().at(ac->id()).firstname() == "David"); | 148 BOOST_TEST(get(ac->id())["firstname"].get<std::string>() == "David"); |
109 } | 149 } |
110 | 150 |
151 /* | |
152 * account::set_lastname. | |
153 * ------------------------------------------------------------------ | |
154 */ | |
111 BOOST_AUTO_TEST_CASE(set_lastname) | 155 BOOST_AUTO_TEST_CASE(set_lastname) |
112 { | 156 { |
113 auto ac = db_->account_draft("markand", "nopassword"); | 157 auto ac = db_->account_draft("markand", "nopassword"); |
114 | 158 |
115 ac->set_lastname("Bertrand"); | 159 ac->set_lastname("Bertrand"); |
116 | |
117 BOOST_TEST(db_->test_account_dao()->accounts().size() == 0U); | |
118 | |
119 ac->save(); | 160 ac->save(); |
120 ac->set_lastname("Demelier"); | 161 ac->set_lastname("Demelier"); |
121 | 162 |
122 BOOST_TEST(db_->test_account_dao()->accounts().at(ac->id()).lastname() == "Demelier"); | 163 BOOST_TEST(get(ac->id())["lastname"].get<std::string>() == "Demelier"); |
123 } | 164 } |
124 | 165 |
166 /* | |
167 * account::add_character. | |
168 * ------------------------------------------------------------------ | |
169 */ | |
170 BOOST_AUTO_TEST_CASE(add_character) | |
171 { | |
172 auto ac = db_->account_draft("markand", "nopassword"); | |
173 | |
174 ac->save(); | |
175 | |
176 auto& ch = ac->add_character(db_->character_draft("erekin", "fire")); | |
177 | |
178 BOOST_TEST(ch->is_published()); | |
179 BOOST_TEST(characters().size() == 1U); | |
180 } | |
181 | |
182 /* | |
183 * account::dao::find_by_login suite. | |
184 * ------------------------------------------------------------------ | |
185 */ | |
125 BOOST_AUTO_TEST_SUITE(find_by_login) | 186 BOOST_AUTO_TEST_SUITE(find_by_login) |
126 | 187 |
188 /* | |
189 * Find existing account. | |
190 * ------------------------------------------------------------------ | |
191 */ | |
127 BOOST_AUTO_TEST_CASE(simple) | 192 BOOST_AUTO_TEST_CASE(simple) |
128 { | 193 { |
129 db_->account_draft("markand", "nopassword")->save(); | 194 { |
130 | 195 auto ac = db_->account_draft("markand", "nopassword"); |
131 auto ac = db_->account_dao()->find_by_login("markand"); | 196 |
132 | 197 ac->set_email("markand@malikania.fr"); |
133 BOOST_TEST(ac); | 198 ac->set_firstname("David"); |
199 ac->set_lastname("Demelier"); | |
200 ac->save(); | |
201 ac->add_character(db_->character_draft("erekin", "mage")); | |
202 ac->add_character(db_->character_draft("irina", "fairy")); | |
203 } | |
204 | |
205 auto ac = db_->account_dao().find_by_login("markand"); | |
206 | |
134 BOOST_TEST(ac->is_published()); | 207 BOOST_TEST(ac->is_published()); |
135 BOOST_TEST(ac->login() == "markand"); | 208 BOOST_TEST(ac->login() == "markand"); |
136 } | 209 BOOST_TEST(ac->email() == "markand@malikania.fr"); |
137 | 210 BOOST_TEST(ac->firstname() == "David"); |
211 BOOST_TEST(ac->lastname() == "Demelier"); | |
212 BOOST_TEST(ac->characters().size() == 2U); | |
213 } | |
214 | |
215 /* | |
216 * Not existing account. | |
217 * ------------------------------------------------------------------ | |
218 */ | |
138 BOOST_AUTO_TEST_CASE(not_found) | 219 BOOST_AUTO_TEST_CASE(not_found) |
139 { | 220 { |
140 auto ac = db_->account_dao()->find_by_login("doesnotexist"); | 221 auto ac = db_->account_dao().find_by_login("doesnotexist"); |
141 | 222 |
142 BOOST_TEST(!ac); | 223 BOOST_TEST(!ac); |
143 } | 224 } |
144 | 225 |
145 BOOST_AUTO_TEST_CASE(same_instance) | |
146 { | |
147 db_->account_draft("markand", "nopassword")->save(); | |
148 | |
149 auto a1 = db_->account_dao()->find_by_login("markand"); | |
150 auto a2 = db_->account_dao()->find_by_login("markand"); | |
151 | |
152 BOOST_TEST(db_->test_account_dao()->accounts().size() == 1U); | |
153 BOOST_TEST(a1 == a2); | |
154 } | |
155 | |
156 BOOST_AUTO_TEST_CASE(new_instance) | |
157 { | |
158 db_->account_draft("markand", "nopassword")->save(); | |
159 | |
160 /* | |
161 * Get rid of a1 reference, account::dao is supposed to call | |
162 * do_find_by_login again, creating a new pointer to the account. | |
163 */ | |
164 auto a1 = db_->account_dao()->find_by_login("markand"); | |
165 a1 = nullptr; | |
166 | |
167 auto a2 = db_->account_dao()->find_by_login("markand"); | |
168 | |
169 BOOST_TEST(db_->test_account_dao()->accounts().size() == 1U); | |
170 BOOST_TEST(a1 != a2); | |
171 } | |
172 | |
173 BOOST_AUTO_TEST_SUITE_END() | 226 BOOST_AUTO_TEST_SUITE_END() |
174 | 227 |
175 BOOST_AUTO_TEST_SUITE_END() | 228 BOOST_AUTO_TEST_SUITE_END() |
176 | 229 |
230 /* | |
231 * Test behaviour with broken implementation. | |
232 * ------------------------------------------------------------------ | |
233 */ | |
177 BOOST_AUTO_TEST_SUITE(broken) | 234 BOOST_AUTO_TEST_SUITE(broken) |
178 | 235 |
236 /* | |
237 * account::save. | |
238 * ------------------------------------------------------------------ | |
239 */ | |
179 BOOST_AUTO_TEST_CASE(save) | 240 BOOST_AUTO_TEST_CASE(save) |
180 { | 241 { |
181 broken_account ac("markand", "nopassword"); | 242 broken_account ac("markand", "nopassword"); |
182 | 243 |
183 try { | 244 try { |
185 } catch (...) {} | 246 } catch (...) {} |
186 | 247 |
187 BOOST_TEST(ac.is_draft()); | 248 BOOST_TEST(ac.is_draft()); |
188 } | 249 } |
189 | 250 |
251 /* | |
252 * account::remove. | |
253 * ------------------------------------------------------------------ | |
254 */ | |
255 BOOST_AUTO_TEST_CASE(remove) | |
256 { | |
257 broken_account ac("markand", "nopassword", broken_account::allow_flags::save); | |
258 | |
259 ac.save(); | |
260 | |
261 try { | |
262 ac.remove(); | |
263 } catch (...) {} | |
264 | |
265 BOOST_TEST(ac.is_published()); | |
266 } | |
267 | |
268 /* | |
269 * account::set_password. | |
270 * ------------------------------------------------------------------ | |
271 */ | |
190 BOOST_AUTO_TEST_CASE(set_password) | 272 BOOST_AUTO_TEST_CASE(set_password) |
191 { | 273 { |
192 broken_account ac("markand", "nopassword", broken_account::allow_flags::save); | 274 broken_account ac("markand", "nopassword", broken_account::allow_flags::save); |
193 | 275 |
194 ac.save(); | 276 ac.save(); |
198 } catch (...) {} | 280 } catch (...) {} |
199 | 281 |
200 BOOST_TEST(ac.password() == "nopassword"); | 282 BOOST_TEST(ac.password() == "nopassword"); |
201 } | 283 } |
202 | 284 |
285 /* | |
286 * account::set_email. | |
287 * ------------------------------------------------------------------ | |
288 */ | |
203 BOOST_AUTO_TEST_CASE(set_email) | 289 BOOST_AUTO_TEST_CASE(set_email) |
204 { | 290 { |
205 broken_account ac("markand", "nopassword", broken_account::allow_flags::save); | 291 broken_account ac("markand", "nopassword", broken_account::allow_flags::save); |
206 | 292 |
207 ac.save(); | 293 ac.save(); |
211 } catch (...) {} | 297 } catch (...) {} |
212 | 298 |
213 BOOST_TEST(ac.email() == ""); | 299 BOOST_TEST(ac.email() == ""); |
214 } | 300 } |
215 | 301 |
302 /* | |
303 * account::set_firstname. | |
304 * ------------------------------------------------------------------ | |
305 */ | |
216 BOOST_AUTO_TEST_CASE(set_firstname) | 306 BOOST_AUTO_TEST_CASE(set_firstname) |
217 { | 307 { |
218 broken_account ac("markand", "nopassword", broken_account::allow_flags::save); | 308 broken_account ac("markand", "nopassword", broken_account::allow_flags::save); |
219 | 309 |
220 ac.save(); | 310 ac.save(); |
224 } catch (...) {} | 314 } catch (...) {} |
225 | 315 |
226 BOOST_TEST(ac.firstname() == ""); | 316 BOOST_TEST(ac.firstname() == ""); |
227 } | 317 } |
228 | 318 |
319 /* | |
320 * account::set_lastname. | |
321 * ------------------------------------------------------------------ | |
322 */ | |
229 BOOST_AUTO_TEST_CASE(set_lastname) | 323 BOOST_AUTO_TEST_CASE(set_lastname) |
230 { | 324 { |
231 broken_account ac("markand", "nopassword", broken_account::allow_flags::save); | 325 broken_account ac("markand", "nopassword", broken_account::allow_flags::save); |
232 | 326 |
233 ac.save(); | 327 ac.save(); |
237 } catch (...) {} | 331 } catch (...) {} |
238 | 332 |
239 BOOST_TEST(ac.lastname() == ""); | 333 BOOST_TEST(ac.lastname() == ""); |
240 } | 334 } |
241 | 335 |
336 /* | |
337 * account::add_character. | |
338 * ------------------------------------------------------------------ | |
339 */ | |
340 BOOST_AUTO_TEST_CASE(add_character) | |
341 { | |
342 broken_account ac("markand", "nopassword", broken_account::allow_flags::save); | |
343 | |
344 ac.save(); | |
345 | |
346 try { | |
347 ac.add_character(std::make_unique<broken_character>("erekin", "fire")); | |
348 } catch (...) {} | |
349 | |
350 BOOST_TEST(ac.characters().size() == 0U); | |
351 } | |
352 | |
242 BOOST_AUTO_TEST_SUITE_END() | 353 BOOST_AUTO_TEST_SUITE_END() |
243 | 354 |
244 } // !server | 355 } // !server |
245 | 356 |
246 } // !mlk | 357 } // !mlk |