12
12
from microsetta_private_api .model .campaign import (FundRazrPayment , Item ,
13
13
Shipping )
14
14
from microsetta_private_api .model .address import Address
15
+ from microsetta_private_api .model .activation_code import ActivationCode
15
16
from microsetta_private_api .model .daklapack_order import DaklapackOrder
16
17
from microsetta_private_api .repo .account_repo import AccountRepo
17
18
from microsetta_private_api .repo .admin_repo import AdminRepo
@@ -315,20 +316,102 @@ def setUp(self, verify_address_result):
315
316
res = cur .fetchone ()
316
317
self .sub_ftp_id = res [0 ]
317
318
319
+ # dummy information for ffq code search
320
+ # interested users
321
+ fake_ffq_emails = [
"[email protected] " ]
* 3 + [
322
+
323
+
324
+ cur .execute (
325
+ "INSERT INTO campaign.interested_users " +
326
+ "(campaign_id, first_name, last_name, email) VALUES " +
327
+ ", " .join ([
328
+ f"('{ self .test_campaign_id1 } ', 'Fir', 'Last', '{ email } ')"
329
+ for email in fake_ffq_emails
330
+ ]) +
331
+ "RETURNING interested_user_id"
332
+ )
333
+ self .iu_ids = [tup [0 ] for tup in cur .fetchall ()]
334
+
335
+ # transactions
336
+ self .tx_ids = {
337
+ f"MT{ idx + 1 } " : iu_id
338
+ for idx , iu_id in enumerate (self .iu_ids ) if idx < 6
339
+ }
340
+ self .
tx_ids [
'MT7' ]
= self .
iu_ids [
- 6 ]
# extra tx for [email protected]
341
+ cur .execute (
342
+ "INSERT INTO campaign.transaction VALUES " +
343
+ ", " .join ([
344
+ f"('{ tx_id } ', '{ iu_id } ', 'fundrazr', '4Tqx5', " +
345
+ "'2023-01-01', 100, 100, 'usd', 'Fir', 'Last', " +
346
+ "'[email protected] ', 'paypal', 'coolcool', TRUE)"
347
+ for tx_id , iu_id in self .tx_ids .items ()
348
+ ])
349
+ )
350
+
351
+ # fundrazr transaction perks
352
+ cur .execute (
353
+ "INSERT INTO campaign.fundrazr_transaction_perk " +
354
+ "(transaction_id, perk_id, quantity, processed) VALUES " +
355
+ ", " .join ([
356
+ f"('{ tx_id } ', '3QeVd', 1, TRUE)" for tx_id in self .tx_ids
357
+ if tx_id not in ['MT3' , 'MT6' ]
358
+ ]) +
359
+ "RETURNING id"
360
+ )
361
+ self .dummy_ftp_ids = [tup [0 ] for tup in cur .fetchall ()]
362
+ cur .execute (
363
+ "INSERT INTO campaign.fundrazr_transaction_perk "
364
+ "(transaction_id, perk_id, quantity, processed) VALUES "
365
+ "('MT5', '3QeW6', 1, TRUE) "
366
+ "RETURNING id"
367
+ )
# extra ftp for [email protected]
368
+ self .dummy_ftp_ids .append (cur .fetchone ()[0 ])
369
+
370
+ # ffq registration codes
371
+ self .new_ffq_codes = [
372
+ ActivationCode .generate_code ()
373
+ for _ in range (6 )
374
+ ]
375
+ ffq_reg_codes = [ # odd idx: used
376
+ (code , 'NULL' ) if idx % 2 == 0 else (code , "'2023-02-01'" )
377
+ for idx , code in enumerate (self .new_ffq_codes )
378
+ ]
379
+ cur .execute (
380
+ "INSERT INTO campaign.ffq_registration_codes VALUES " +
381
+ ", " .join ([
382
+ f"('{ code } ', { used } )" for code , used in ffq_reg_codes
383
+ ])
384
+ )
385
+
386
+ # fundrazr ffq codes
387
+ fundrazr_ffq_codes = {}
388
+ for idx , code in enumerate (self .new_ffq_codes ):
389
+ if idx <= 3 :
390
+ fundrazr_ffq_codes [code ] = self .dummy_ftp_ids [idx ]
391
+ else : # 2 codes
392
+ fundrazr_ffq_codes [code ] = self .dummy_ftp_ids [4 ]
393
+ cur .execute (
394
+ "INSERT INTO campaign.fundrazr_ffq_codes VALUES " +
395
+ ", " .join ([
396
+ f"('{ ftp_id } ', '{ code } ')"
397
+ for code , ftp_id in fundrazr_ffq_codes .items ()
398
+ ])
399
+ )
400
+
318
401
t .commit ()
319
402
320
403
def tearDown (self ):
321
404
with Transaction () as t :
322
405
cur = t .cursor ()
323
406
cur .execute (
324
- "DELETE FROM campaign.campaigns_projects "
325
- "WHERE campaign_id = %s" ,
326
- (self .test_campaign_id1 , )
407
+ "DELETE FROM campaign.fundrazr_ffq_codes AS ffc "
408
+ "WHERE ffc.ffq_registration_code In %s" ,
409
+ (tuple ( self .new_ffq_codes ), )
327
410
)
328
411
cur .execute (
329
- "DELETE FROM campaign.campaigns "
330
- "WHERE campaign_id = %s" ,
331
- (self .test_campaign_id1 , )
412
+ "DELETE FROM campaign.ffq_registration_codes AS frc "
413
+ "WHERE frc.ffq_registration_code IN %s" ,
414
+ (tuple ( self .new_ffq_codes ) , )
332
415
)
333
416
cur .execute (
334
417
"DELETE FROM campaign.fundrazr_transaction_perk "
@@ -338,19 +421,38 @@ def tearDown(self):
338
421
self .ffq_ftp_id ,
339
422
self .kit_ftp_id ,
340
423
self .two_kit_ftp_id ,
341
- self .sub_ftp_id
424
+ self .sub_ftp_id ,
425
+ * self .dummy_ftp_ids
342
426
),
343
427
)
344
428
)
345
429
cur .execute (
346
430
"DELETE FROM campaign.transaction "
347
431
"WHERE id IN %s" ,
348
- ((
349
- FFQ_TRANSACTION_ID ,
350
- KIT_TRANSACTION_ID ,
351
- TWO_KIT_TRANSACTION_ID ,
352
- SUB_TRANSACTION_ID
353
- ), )
432
+ (
433
+ (
434
+ FFQ_TRANSACTION_ID ,
435
+ KIT_TRANSACTION_ID ,
436
+ TWO_KIT_TRANSACTION_ID ,
437
+ SUB_TRANSACTION_ID ,
438
+ * self .tx_ids
439
+ ),
440
+ )
441
+ )
442
+ cur .execute (
443
+ "DELETE FROM campaign.interested_users AS iu "
444
+ "WHERE iu.interested_user_id IN %s" ,
445
+ (tuple (self .iu_ids ), )
446
+ )
447
+ cur .execute (
448
+ "DELETE FROM campaign.campaigns_projects "
449
+ "WHERE campaign_id = %s" ,
450
+ (self .test_campaign_id1 ,)
451
+ )
452
+ cur .execute (
453
+ "DELETE FROM campaign.campaigns "
454
+ "WHERE campaign_id = %s" ,
455
+ (self .test_campaign_id1 , )
354
456
)
355
457
t .commit ()
356
458
@@ -1174,6 +1276,103 @@ def _count_fundrazr_ffq_codes(self, t):
1174
1276
res = cur .fetchone ()
1175
1277
return res [0 ]
1176
1278
1279
+ def test_get_ffq_codes_by_email (self ):
1280
+ with Transaction () as t :
1281
+ pfr = PerkFulfillmentRepo (t )
1282
+
1283
+ # Test: email not found
1284
+ ffq_code = pfr .
get_ffq_codes_by_email (
"[email protected] " )
1285
+ self .assertEqual (len (ffq_code ), 0 )
1286
+
1287
+ # Test: no ffq without transaction
1288
+ ffq_code = pfr .
get_ffq_codes_by_email (
"[email protected] " )
# unique
1289
+ self .assertEqual (len (ffq_code ), 1 )
1290
+ self .
assertEqual (
ffq_code [
0 ][
'email' ],
"[email protected] " )
1291
+ self .assertIsNone (ffq_code [0 ]['transaction_created_time' ])
1292
+ self .assertIsNone (ffq_code [0 ]['ffq_registration_code' ])
1293
+
1294
+ ffq_code = pfr .
get_ffq_codes_by_email (
"[email protected] " )
# duplicate
1295
+ self .assertEqual (len (ffq_code ), 1 )
1296
+ self .
assertEqual (
ffq_code [
0 ][
'email' ],
"[email protected] " )
1297
+ self .assertIsNone (ffq_code [0 ]['ffq_registration_code' ])
1298
+
1299
+ # Test: no ffq with transaction
1300
+ ffq_code = pfr .
get_ffq_codes_by_email (
"[email protected] " )
1301
+ self .assertEqual (len (ffq_code ), 1 )
1302
+ self .
assertEqual (
ffq_code [
0 ][
'email' ],
"[email protected] " )
1303
+ self .assertIsNone (ffq_code [0 ]['transaction_created_time' ])
1304
+ self .assertIsNone (ffq_code [0 ]['ffq_registration_code' ])
1305
+
1306
+ # Test: 1 ffq code
1307
+ ffq_code = pfr .
get_ffq_codes_by_email (
"[email protected] " )
1308
+ self .assertEqual (len (ffq_code ), 1 )
1309
+ self .
assertEqual (
ffq_code [
0 ][
'email' ],
"[email protected] " )
1310
+ self .assertEqual (
1311
+ ffq_code [0 ]['transaction_created_time' ].strftime ('%Y-%m-%d' ),
1312
+ '2023-01-01'
1313
+ )
1314
+ self .assertEqual (
1315
+ ffq_code [0 ]['ffq_registration_code' ], self .new_ffq_codes [2 ]
1316
+ )
1317
+ self .assertIsNone (ffq_code [0 ]['registration_code_used' ])
1318
+
1319
+ # Test: 3 duplicate emails, 2 codes
1320
+ ffq_code = pfr .
get_ffq_codes_by_email (
"[email protected] " )
1321
+ self .assertEqual (len (ffq_code ), 2 )
1322
+ self .assertTrue (
1323
+ ffq_code [
0 ][
'email' ]
== ffq_code [
1 ][
'email' ]
== "[email protected] "
1324
+ )
1325
+ self .assertEqual (
1326
+ ffq_code [0 ]['transaction_created_time' ].strftime ('%Y-%m-%d' ),
1327
+ '2023-01-01'
1328
+ )
1329
+ got_codes = [
1330
+ ffq_code [i ]['ffq_registration_code' ]
1331
+ for i in range (2 )
1332
+ ]
1333
+ self .assertEqual (set (got_codes ), set (self .new_ffq_codes [:2 ]))
1334
+
1335
+ # Test: unique email, 3 codes
1336
+ ffq_code = pfr .
get_ffq_codes_by_email (
"[email protected] " )
1337
+ self .assertEqual (len (ffq_code ), 3 )
1338
+ self .assertTrue (
1339
+ ffq_code [
0 ][
'email' ]
== ffq_code [
2 ][
'email' ]
== "[email protected] "
1340
+ )
1341
+ self .assertEqual (
1342
+ ffq_code [2 ]['transaction_created_time' ].strftime ('%Y-%m-%d' ),
1343
+ '2023-01-01'
1344
+ )
1345
+ got_codes = [
1346
+ ffq_code [i ]['ffq_registration_code' ]
1347
+ for i in range (3 )
1348
+ ]
1349
+ self .assertEqual (set (got_codes ), set (self .new_ffq_codes [3 :]))
1350
+
1351
+ # Test: match multiple emails
1352
+ ffq_code = pfr .get_ffq_codes_by_email ("iu" )
1353
+ self .assertEqual (len (ffq_code ), 3 )
1354
+ self .assertTrue (
1355
+ ffq_code [
1 ][
'email' ]
== ffq_code [
2 ][
'email' ]
== "[email protected] "
1356
+ )
1357
+ self .
assertEqual (
ffq_code [
0 ][
'email' ],
"[email protected] " )
1358
+ self .assertEqual (
1359
+ ffq_code [1 ]['transaction_created_time' ].strftime ('%Y-%m-%d' ),
1360
+ '2023-01-01'
1361
+ )
1362
+ got_codes = [
1363
+ ffq_code [i ]['ffq_registration_code' ]
1364
+ for i in range (3 )
1365
+ ]
1366
+ self .assertEqual (set (got_codes ), set (self .new_ffq_codes [:3 ]))
1367
+
1368
+ ffq_code = pfr .get_ffq_codes_by_email ("foo.com" )
1369
+ self .assertEqual (len (ffq_code ), 5 )
1370
+ got_codes = [
1371
+ ffq_code [i ]['ffq_registration_code' ]
1372
+ for i in range (5 )
1373
+ ]
1374
+ self .assertNotIn (self .new_ffq_codes [2 ], got_codes )
1375
+
1177
1376
1178
1377
if __name__ == '__main__' :
1179
1378
unittest .main ()
0 commit comments