@@ -541,17 +541,82 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
541541 XCTAssertEqual ( command. body? . email, email)
542542 }
543543
544- func testSaveAndUpdateCurrentUser( ) { // swiftlint:disable:this function_body_length
544+ func testSaveAndUpdateCurrentUser( ) throws { // swiftlint:disable:this function_body_length
545545 XCTAssertNil ( User . current? . objectId)
546- testLogin ( )
547- MockURLProtocol . removeAll ( )
546+ try userSignUp ( )
548547 XCTAssertNotNil ( User . current? . objectId)
549548
550549 guard let user = User . current else {
551550 XCTFail ( " Should unwrap " )
552551 return
553552 }
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)
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+ }
554608
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)
555620 var userOnServer = user
556621 userOnServer. createdAt = User . current? . createdAt
557622 userOnServer. updatedAt = User . current? . updatedAt? . addingTimeInterval ( + 300 )
@@ -572,6 +637,7 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
572637 do {
573638 let saved = try user. save ( options: [ . useMasterKey] )
574639 XCTAssert ( saved. hasSameObjectId ( as: userOnServer) )
640+ XCTAssertEqual ( saved. email, user. email)
575641 guard let savedCreatedAt = saved. createdAt,
576642 let savedUpdatedAt = saved. updatedAt else {
577643 XCTFail ( " Should unwrap dates " )
@@ -588,6 +654,7 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
588654
589655 //Should be updated in memory
590656 XCTAssertEqual ( User . current? . updatedAt, savedUpdatedAt)
657+ XCTAssertEqual ( User . current? . email, user. email)
591658
592659 #if !os(Linux) && !os(Android)
593660 //Should be updated in Keychain
@@ -597,24 +664,98 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
597664 return
598665 }
599666 XCTAssertEqual ( keychainUser. currentUser? . updatedAt, savedUpdatedAt)
667+ XCTAssertEqual ( keychainUser. currentUser? . email, user. email)
600668 #endif
601669
602670 } catch {
603671 XCTFail ( error. localizedDescription)
604672 }
605673 }
606674
607- func testSaveAsyncAndUpdateCurrentUser( ) { // swiftlint:disable:this function_body_length
675+ func testSaveAsyncAndUpdateCurrentUser( ) throws { // swiftlint:disable:this function_body_length
608676 XCTAssertNil ( User . current? . objectId)
609- testLogin ( )
610- MockURLProtocol . removeAll ( )
677+ try userSignUp ( )
611678 XCTAssertNotNil ( User . current? . objectId)
612679
613680 guard let user = User . current else {
614681 XCTFail ( " Should unwrap " )
615682 return
616683 }
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+ }
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+ }
617747
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)
618759 var userOnServer = user
619760 userOnServer. createdAt = User . current? . createdAt
620761 userOnServer. updatedAt = User . current? . updatedAt? . addingTimeInterval ( + 300 )
@@ -636,10 +777,11 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
636777 user. save ( options: [ ] , callbackQueue: . global( qos: . background) ) { result in
637778
638779 switch result {
639- case . success( let fetched) :
640- XCTAssert ( fetched. hasSameObjectId ( as: userOnServer) )
641- guard let fetchedCreatedAt = fetched. createdAt,
642- 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 {
643785 XCTFail ( " Should unwrap dates " )
644786 expectation1. fulfill ( )
645787 return
@@ -650,12 +792,13 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
650792 expectation1. fulfill ( )
651793 return
652794 }
653- XCTAssertEqual ( fetchedCreatedAt , originalCreatedAt)
654- XCTAssertGreaterThan ( fetchedUpdatedAt , originalUpdatedAt)
655- XCTAssertNil ( fetched . ACL)
795+ XCTAssertEqual ( savedCreatedAt , originalCreatedAt)
796+ XCTAssertGreaterThan ( savedUpdatedAt , originalUpdatedAt)
797+ XCTAssertNil ( saved . ACL)
656798
657799 //Should be updated in memory
658- XCTAssertEqual ( User . current? . updatedAt, fetchedUpdatedAt)
800+ XCTAssertEqual ( User . current? . updatedAt, savedUpdatedAt)
801+ XCTAssertEqual ( User . current? . email, user. email)
659802
660803 #if !os(Linux) && !os(Android)
661804 //Should be updated in Keychain
@@ -664,7 +807,8 @@ class ParseUserTests: XCTestCase { // swiftlint:disable:this type_body_length
664807 XCTFail ( " Should get object from Keychain " )
665808 return
666809 }
667- XCTAssertEqual ( keychainUser. currentUser? . updatedAt, fetchedUpdatedAt)
810+ XCTAssertEqual ( keychainUser. currentUser? . updatedAt, savedUpdatedAt)
811+ XCTAssertEqual ( keychainUser. currentUser? . email, user. email)
668812 #endif
669813
670814 case . failure( let error) :
0 commit comments