@@ -61,6 +61,16 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
61
61
62
62
self . emailVerified = false
63
63
}
64
+
65
+ func createUser( ) -> User {
66
+ var user = User ( )
67
+ user. objectId = objectId
68
+ user. ACL = ACL
69
+ user. customKey = customKey
70
+ user. username = username
71
+ user. email = email
72
+ return user
73
+ }
64
74
}
65
75
66
76
let loginUserName = " hello10 "
@@ -454,17 +464,159 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
454
464
XCTAssertNotNil ( command. body)
455
465
}
456
466
457
- func testSaveAndUpdateCurrentUser( ) { // swiftlint:disable:this function_body_length
458
- XCTAssertNil ( User . current? . objectId)
459
- testLogin ( )
467
+ func userSignUp( ) throws {
468
+ let loginResponse = LoginSignupResponse ( )
469
+
470
+ MockURLProtocol . mockRequests { _ in
471
+ do {
472
+ let encoded = try loginResponse. getEncoder ( ) . encode ( loginResponse, skipKeys: . none)
473
+ return MockURLResponse ( data: encoded, statusCode: 200 , delay: 0.0 )
474
+ } catch {
475
+ return nil
476
+ }
477
+ }
478
+ _ = try loginResponse. createUser ( ) . signup ( )
460
479
MockURLProtocol . removeAll ( )
480
+ guard let currentUser = User . current else {
481
+ XCTFail ( " Should have a current user after signup " )
482
+ return
483
+ }
484
+ XCTAssertEqual ( currentUser. objectId, loginResponse. objectId)
485
+ XCTAssertEqual ( currentUser. username, loginResponse. username)
486
+ XCTAssertEqual ( currentUser. email, loginResponse. email)
487
+ XCTAssertEqual ( currentUser. ACL, loginResponse. ACL)
488
+ XCTAssertEqual ( currentUser. customKey, loginResponse. customKey)
489
+ }
490
+
491
+ func testUpdateCommandUnmodifiedEmail( ) throws {
492
+ try userSignUp ( )
493
+ guard let user = User . current,
494
+ let objectId = user. objectId else {
495
+ XCTFail ( " Should have current user. " )
496
+ return
497
+ }
498
+ XCTAssertNotNil ( user. email)
499
+ let command = try user. saveCommand ( )
500
+ XCTAssertNotNil ( command)
501
+ XCTAssertEqual ( command. path. urlComponent, " /users/ \( objectId) " )
502
+ XCTAssertEqual ( command. method, API . Method. PUT)
503
+ XCTAssertNil ( command. params)
504
+ XCTAssertNotNil ( command. body)
505
+ XCTAssertNil ( command. body? . email)
506
+ }
507
+
508
+ func testUpdateCommandModifiedEmail( ) throws {
509
+ try userSignUp ( )
510
+ guard var user = User . current,
511
+ let objectId = user. objectId else {
512
+ XCTFail ( " Should have current user. " )
513
+ return
514
+ }
515
+
516
+ user. email = email
517
+ XCTAssertNotNil ( user. email)
518
+ let command = try user. saveCommand ( )
519
+ XCTAssertNotNil ( command)
520
+ XCTAssertEqual ( command. path. urlComponent, " /users/ \( objectId) " )
521
+ XCTAssertEqual ( command. method, API . Method. PUT)
522
+ XCTAssertNil ( command. params)
523
+ XCTAssertNotNil ( command. body)
524
+ XCTAssertEqual ( command. body? . email, email)
525
+ }
526
+
527
+ func testUpdateCommandNotCurrentModifiedEmail( ) throws {
528
+ try userSignUp ( )
529
+ var user = User ( )
530
+ let objectId = " yarr "
531
+ user. objectId = objectId
532
+
533
+ user. email = email
534
+ XCTAssertNotNil ( user. email)
535
+ let command = try user. saveCommand ( )
536
+ XCTAssertNotNil ( command)
537
+ XCTAssertEqual ( command. path. urlComponent, " /users/ \( objectId) " )
538
+ XCTAssertEqual ( command. method, API . Method. PUT)
539
+ XCTAssertNil ( command. params)
540
+ XCTAssertNotNil ( command. body)
541
+ XCTAssertEqual ( command. body? . email, email)
542
+ }
543
+
544
+ func testSaveAndUpdateCurrentUser( ) throws { // swiftlint:disable:this function_body_length
545
+ XCTAssertNil ( User . current? . objectId)
546
+ try userSignUp ( )
461
547
XCTAssertNotNil ( User . current? . objectId)
462
548
463
549
guard let user = User . current else {
464
550
XCTFail ( " Should unwrap " )
465
551
return
466
552
}
553
+ XCTAssertNotNil ( user. email)
554
+ var userOnServer = user
555
+ userOnServer. createdAt = User . current? . createdAt
556
+ userOnServer. updatedAt = User . current? . updatedAt? . addingTimeInterval ( + 300 )
557
+
558
+ let encoded : Data !
559
+ do {
560
+ encoded = try userOnServer. getEncoder ( ) . encode ( userOnServer, skipKeys: . none)
561
+ //Get dates in correct format from ParseDecoding strategy
562
+ userOnServer = try userOnServer. getDecoder ( ) . decode ( User . self, from: encoded)
563
+ } catch {
564
+ XCTFail ( " Should encode/decode. Error \( error) " )
565
+ return
566
+ }
567
+ MockURLProtocol . mockRequests { _ in
568
+ return MockURLResponse ( data: encoded, statusCode: 200 , delay: 0.0 )
569
+ }
570
+
571
+ do {
572
+ let saved = try user. save ( options: [ . useMasterKey] )
573
+ XCTAssert ( saved. hasSameObjectId ( as: userOnServer) )
574
+ XCTAssertEqual ( saved. email, user. email)
575
+ guard let savedCreatedAt = saved. createdAt,
576
+ let savedUpdatedAt = saved. updatedAt else {
577
+ XCTFail ( " Should unwrap dates " )
578
+ return
579
+ }
580
+ guard let originalCreatedAt = user. createdAt,
581
+ let originalUpdatedAt = user. updatedAt else {
582
+ XCTFail ( " Should unwrap dates " )
583
+ return
584
+ }
585
+ XCTAssertEqual ( savedCreatedAt, originalCreatedAt)
586
+ XCTAssertGreaterThan ( savedUpdatedAt, originalUpdatedAt)
587
+ XCTAssertNil ( saved. ACL)
588
+
589
+ //Should be updated in memory
590
+ XCTAssertEqual ( User . current? . updatedAt, savedUpdatedAt)
591
+ XCTAssertEqual ( User . current? . email, user. email)
467
592
593
+ #if !os(Linux) && !os(Android)
594
+ //Should be updated in Keychain
595
+ guard let keychainUser: CurrentUserContainer < BaseParseUser >
596
+ = try ? KeychainStore . shared. get ( valueFor: ParseStorage . Keys. currentUser) else {
597
+ XCTFail ( " Should get object from Keychain " )
598
+ return
599
+ }
600
+ XCTAssertEqual ( keychainUser. currentUser? . updatedAt, savedUpdatedAt)
601
+ XCTAssertEqual ( keychainUser. currentUser? . email, user. email)
602
+ #endif
603
+
604
+ } catch {
605
+ XCTFail ( error. localizedDescription)
606
+ }
607
+ }
608
+
609
+ func testSaveAndUpdateCurrentUserModifiedEmail( ) throws { // swiftlint:disable:this function_body_length
610
+ XCTAssertNil ( User . current? . objectId)
611
+ try userSignUp ( )
612
+ XCTAssertNotNil ( User . current? . objectId)
613
+
614
+ guard var user = User . current else {
615
+ XCTFail ( " Should unwrap " )
616
+ return
617
+ }
618
+
619
+ XCTAssertNotEqual ( User . current? . email, user. email)
468
620
var userOnServer = user
469
621
userOnServer. createdAt = User . current? . createdAt
470
622
userOnServer. updatedAt = User . current? . updatedAt? . addingTimeInterval ( + 300 )
@@ -485,6 +637,7 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
485
637
do {
486
638
let saved = try user. save ( options: [ . useMasterKey] )
487
639
XCTAssert ( saved. hasSameObjectId ( as: userOnServer) )
640
+ XCTAssertEqual ( saved. email, user. email)
488
641
guard let savedCreatedAt = saved. createdAt,
489
642
let savedUpdatedAt = saved. updatedAt else {
490
643
XCTFail ( " Should unwrap dates " )
@@ -501,6 +654,7 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
501
654
502
655
//Should be updated in memory
503
656
XCTAssertEqual ( User . current? . updatedAt, savedUpdatedAt)
657
+ XCTAssertEqual ( User . current? . email, user. email)
504
658
505
659
#if !os(Linux) && !os(Android)
506
660
//Should be updated in Keychain
@@ -510,24 +664,98 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
510
664
return
511
665
}
512
666
XCTAssertEqual ( keychainUser. currentUser? . updatedAt, savedUpdatedAt)
667
+ XCTAssertEqual ( keychainUser. currentUser? . email, user. email)
513
668
#endif
514
669
515
670
} catch {
516
671
XCTFail ( error. localizedDescription)
517
672
}
518
673
}
519
674
520
- func testSaveAsyncAndUpdateCurrentUser( ) { // swiftlint:disable:this function_body_length
675
+ func testSaveAsyncAndUpdateCurrentUser( ) throws { // swiftlint:disable:this function_body_length
521
676
XCTAssertNil ( User . current? . objectId)
522
- testLogin ( )
523
- MockURLProtocol . removeAll ( )
677
+ try userSignUp ( )
524
678
XCTAssertNotNil ( User . current? . objectId)
525
679
526
680
guard let user = User . current else {
527
681
XCTFail ( " Should unwrap " )
528
682
return
529
683
}
684
+ XCTAssertNotNil ( user. email)
685
+ var userOnServer = user
686
+ userOnServer. createdAt = User . current? . createdAt
687
+ userOnServer. updatedAt = User . current? . updatedAt? . addingTimeInterval ( + 300 )
688
+
689
+ let encoded : Data !
690
+ do {
691
+ encoded = try userOnServer. getEncoder ( ) . encode ( userOnServer, skipKeys: . none)
692
+ //Get dates in correct format from ParseDecoding strategy
693
+ userOnServer = try userOnServer. getDecoder ( ) . decode ( User . self, from: encoded)
694
+ } catch {
695
+ XCTFail ( " Should encode/decode. Error \( error) " )
696
+ return
697
+ }
698
+ MockURLProtocol . mockRequests { _ in
699
+ return MockURLResponse ( data: encoded, statusCode: 200 , delay: 0.0 )
700
+ }
530
701
702
+ let expectation1 = XCTestExpectation ( description: " Fetch user1 " )
703
+ user. save ( options: [ ] , callbackQueue: . global( qos: . background) ) { result in
704
+
705
+ switch result {
706
+ case . success( let saved) :
707
+ XCTAssert ( saved. hasSameObjectId ( as: userOnServer) )
708
+ XCTAssertEqual ( saved. email, user. email)
709
+ guard let savedCreatedAt = saved. createdAt,
710
+ let savedUpdatedAt = saved. updatedAt else {
711
+ XCTFail ( " Should unwrap dates " )
712
+ expectation1. fulfill ( )
713
+ return
714
+ }
715
+ guard let originalCreatedAt = user. createdAt,
716
+ let originalUpdatedAt = user. updatedAt else {
717
+ XCTFail ( " Should unwrap dates " )
718
+ expectation1. fulfill ( )
719
+ return
720
+ }
721
+ XCTAssertEqual ( savedCreatedAt, originalCreatedAt)
722
+ XCTAssertGreaterThan ( savedUpdatedAt, originalUpdatedAt)
723
+ XCTAssertNil ( saved. ACL)
724
+
725
+ //Should be updated in memory
726
+ XCTAssertEqual ( User . current? . updatedAt, savedUpdatedAt)
727
+ XCTAssertEqual ( User . current? . email, user. email)
728
+
729
+ #if !os(Linux) && !os(Android)
730
+ //Should be updated in Keychain
731
+ guard let keychainUser: CurrentUserContainer < BaseParseUser >
732
+ = try ? KeychainStore . shared. get ( valueFor: ParseStorage . Keys. currentUser) else {
733
+ XCTFail ( " Should get object from Keychain " )
734
+ return
735
+ }
736
+ XCTAssertEqual ( keychainUser. currentUser? . updatedAt, savedUpdatedAt)
737
+ XCTAssertEqual ( keychainUser. currentUser? . email, user. email)
738
+ #endif
739
+
740
+ case . failure( let error) :
741
+ XCTFail ( error. localizedDescription)
742
+ }
743
+ expectation1. fulfill ( )
744
+ }
745
+ wait ( for: [ expectation1] , timeout: 20.0 )
746
+ }
747
+
748
+ func testSaveAsyncAndUpdateCurrentUserModifiedEmail( ) throws { // swiftlint:disable:this function_body_length
749
+ XCTAssertNil ( User . current? . objectId)
750
+ try userSignUp ( )
751
+ XCTAssertNotNil ( User . current? . objectId)
752
+
753
+ guard var user = User . current else {
754
+ XCTFail ( " Should unwrap " )
755
+ return
756
+ }
757
+
758
+ XCTAssertNotEqual ( User . current? . email, user. email)
531
759
var userOnServer = user
532
760
userOnServer. createdAt = User . current? . createdAt
533
761
userOnServer. updatedAt = User . current? . updatedAt? . addingTimeInterval ( + 300 )
@@ -549,10 +777,11 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
549
777
user. save ( options: [ ] , callbackQueue: . global( qos: . background) ) { result in
550
778
551
779
switch result {
552
- case . success( let fetched) :
553
- XCTAssert ( fetched. hasSameObjectId ( as: userOnServer) )
554
- guard let fetchedCreatedAt = fetched. createdAt,
555
- let fetchedUpdatedAt = fetched. updatedAt else {
780
+ case . success( let saved) :
781
+ XCTAssert ( saved. hasSameObjectId ( as: userOnServer) )
782
+ XCTAssertEqual ( saved. email, user. email)
783
+ guard let savedCreatedAt = saved. createdAt,
784
+ let savedUpdatedAt = saved. updatedAt else {
556
785
XCTFail ( " Should unwrap dates " )
557
786
expectation1. fulfill ( )
558
787
return
@@ -563,12 +792,13 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
563
792
expectation1. fulfill ( )
564
793
return
565
794
}
566
- XCTAssertEqual ( fetchedCreatedAt , originalCreatedAt)
567
- XCTAssertGreaterThan ( fetchedUpdatedAt , originalUpdatedAt)
568
- XCTAssertNil ( fetched . ACL)
795
+ XCTAssertEqual ( savedCreatedAt , originalCreatedAt)
796
+ XCTAssertGreaterThan ( savedUpdatedAt , originalUpdatedAt)
797
+ XCTAssertNil ( saved . ACL)
569
798
570
799
//Should be updated in memory
571
- XCTAssertEqual ( User . current? . updatedAt, fetchedUpdatedAt)
800
+ XCTAssertEqual ( User . current? . updatedAt, savedUpdatedAt)
801
+ XCTAssertEqual ( User . current? . email, user. email)
572
802
573
803
#if !os(Linux) && !os(Android)
574
804
//Should be updated in Keychain
@@ -577,7 +807,8 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
577
807
XCTFail ( " Should get object from Keychain " )
578
808
return
579
809
}
580
- XCTAssertEqual ( keychainUser. currentUser? . updatedAt, fetchedUpdatedAt)
810
+ XCTAssertEqual ( keychainUser. currentUser? . updatedAt, savedUpdatedAt)
811
+ XCTAssertEqual ( keychainUser. currentUser? . email, user. email)
581
812
#endif
582
813
583
814
case . failure( let error) :
0 commit comments