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