Example #1
0
 def test_to_dict(self):
     """
     Test that User objects can be recreated.
     """
     d1 = self.user1.to_dict()
     u2 = User(d1)
     d2 = u2.to_dict()
     self.assertEqual(d1, d2)
Example #2
0
 def test_to_dict_old_format(self):
     """
     Test that User objects can be recreated.
     """
     d1 = self.user1.to_dict(old_userdb_format=True)
     u2 = User(d1)
     d2 = u2.to_dict(old_userdb_format=True)
     self.assertEqual(d1, d2)
Example #3
0
    def setUp(self):
        super(AppTests, self).setUp()

        self.test_user_eppn = 'hubba-bubba'
        self.test_user_nin = '200001023456'
        self.mock_address = OrderedDict([
            (u'Name',
             OrderedDict([(u'GivenNameMarking', u'20'),
                          (u'GivenName', u'Testaren Test'),
                          (u'Surname', u'Testsson')])),
            (u'OfficialAddress',
             OrderedDict([(u'Address2', u'\xd6RGATAN 79 LGH 10'),
                          (u'PostalCode', u'12345'), (u'City', u'LANDET')]))
        ])

        self.client = self.app.test_client()

        self.oidc_provider_config = {
            'authorization_endpoint':
            'https://example.com/op/authentication',
            'claims_parameter_supported':
            True,
            'grant_types_supported': ['authorization_code', 'implicit'],
            'id_token_signing_alg_values_supported': ['RS256'],
            'issuer':
            'https://example.com/op/',
            'jwks_uri':
            'https://example.com/op/jwks',
            'response_modes_supported': ['query', 'fragment'],
            'response_types_supported':
            ['code', 'code id_token', 'code token', 'code id_token token'],
            'scopes_supported': ['openid'],
            'subject_types_supported': ['pairwise'],
            'token_endpoint':
            'https://example.com/op/token',
            'token_endpoint_auth_methods_supported': ['client_secret_basic'],
            'userinfo_endpoint':
            'https://example.com/op/userinfo'
        }

        class MockResponse(object):
            def __init__(self, status_code, text):
                self.status_code = status_code
                self.text = text

        self.oidc_provider_config_response = MockResponse(
            200, json.dumps(self.oidc_provider_config))

        # Replace user with one without previous proofings
        userdata = deepcopy(NEW_USER_EXAMPLE)
        del userdata['nins']
        user = User(data=userdata)
        user.modified_ts = True
        self.app.central_userdb.save(user, check_sync=False)
Example #4
0
    def test_unknown_attributes(self):
        """
        Test parsing a document with unknown data in it.
        """
        data = self.data1
        data['unknown_attribute'] = 'something'
        user = User(data, raise_on_unknown=False)
        self.assertEqual(data['_id'], user.user_id)

        with self.assertRaises(UserHasUnknownData):
            User(data, raise_on_unknown=True)
Example #5
0
 def test_two_non_primary_phones(self):
     """
     Test that the first verified number is chosen as primary, if there is a verified number.
     """
     number1 = u'+9112345678'
     number2 = u'+9123456789'
     data = {u'_id': ObjectId(),
             u'displayName': u'xxx yyy',
             u'eduPersonPrincipalName': u'pohig-test',
             u'givenName': u'xxx',
             u'mail': u'*****@*****.**',
             u'mailAliases': [{u'email': u'*****@*****.**', u'verified': True}],
             u'phone': [{u'csrf': u'47d42078719b8377db622c3ff85b94840b483c92',
                          u'number': number1,
                          u'primary': False,
                          u'verified': False},
                         {u'csrf': u'47d42078719b8377db622c3ff85b94840b483c92',
                          u'number': number2,
                          u'primary': False,
                          u'verified': True}],
             u'passwords': [{u'created_ts': datetime.datetime(2014, 6, 29, 17, 52, 37, 830000),
                             u'id': ObjectId(),
                             u'salt': u'$NDNv1H1$foo$32$32$',
                             u'source': u'dashboard'}],
             u'preferredLanguage': u'en',
             u'surname': u'yyy',
             }
     user = User(data)
     self.assertEqual(user.phone_numbers.primary.number, number2)
Example #6
0
 def test_obsolete_attributes(self):
     """
     Test that some obsolete attributes don't cause parse failures.
     """
     data = self.data1
     data['postalAddress'] = {'foo': 'bar'}
     data['date'] = 'anything'
     data['csrf'] = 'long and secret string'
     user = User(data)
     self.assertEqual(self.user1._data, user._data)
Example #7
0
 def test_revoked_user(self):
     """
     Test ability to identify revoked users.
     """
     data = {u'_id': ObjectId(),
             u'eduPersonPrincipalName': u'binib-mufus',
             u'revoked_ts': datetime.datetime(2015, 5, 26, 8, 33, 56, 826000),
             }
     with self.assertRaises(UserIsRevoked):
         User(data)
Example #8
0
 def test_user_with_no_primary_mail(self):
     mail = u'*****@*****.**'
     data = {u'_id': ObjectId(),
             u'eduPersonPrincipalName': u'lutol-bafim',
             u'mailAliases': [{u'email': mail, u'verified': True}],
             u'passwords': [{u'created_ts': datetime.datetime(2014, 9, 4, 8, 57, 7, 362000),
                             u'id': ObjectId(),
                             u'salt': u'salt',
                             u'source': u'dashboard'}],
             }
     user = User(data)
     self.assertEqual(mail, user.mail_addresses.primary.email)
Example #9
0
    def setUp(self):
        self.data1 = {u'_id': ObjectId('547357c3d00690878ae9b620'),
                      u'eduPersonPrincipalName': u'guvat-nalif',
                      u'mail': u'*****@*****.**',
                      u'mailAliases': [{u'added_timestamp': datetime.datetime(2014, 12, 18, 11, 25, 19, 804000),
                                        u'email': u'*****@*****.**',
                                        u'verified': True}],
                      u'passwords': [{u'created_ts': datetime.datetime(2014, 11, 24, 16, 22, 49, 188000),
                                      u'id': ObjectId('54735b588a7d2a2c4ec3e7d0'),
                                      u'salt': u'$NDNv1H1$315d7$32$32$',
                                      u'source': u'dashboard'}],
                      u'norEduPersonNIN': [u'197801012345'],
                      u'subject': u'physical person',
                      u'eduPersonEntitlement': [u'http://foo.example.org'],
                      u'preferredLanguage': u'en',
                      }
        self.user1 = User(self.data1)

        self.data2 = {u'_id': ObjectId('549190b5d00690878ae9b622'),
                      u'displayName': u'Some \xf6ne',
                      u'eduPersonPrincipalName': u'birub-gagoz',
                      u'givenName': u'Some',
                      u'mail': u'*****@*****.**',
                      u'mailAliases': [{u'email': u'*****@*****.**',
                                        u'verified': True},
                                       {u'added_timestamp': datetime.datetime(2014, 12, 17, 14, 35, 14, 728000),
                                        u'email': u'*****@*****.**',
                                        u'verified': True}],
                      u'mobile': [{u'added_timestamp': datetime.datetime(2014, 12, 18, 9, 11, 35, 78000),
                                   u'mobile': u'+46702222222',
                                   u'primary': True,
                                   u'verified': True}],
                      u'passwords': [{u'created_ts': datetime.datetime(2015, 2, 11, 13, 58, 42, 327000),
                                      u'id': ObjectId('54db60128a7d2a26e8690cda'),
                                      u'salt': u'$NDNv1H1$db011fc$32$32$',
                                      u'source': u'dashboard'}],
                      u'preferredLanguage': u'sv',
                      u'surname': u'\xf6ne',
                      u'subject': u'physical person'}
        self.user2 = User(self.data2)
Example #10
0
    def __init__(self, data):
        _data_in = User(data).to_dict()
        _user_id = _data_in['_id']
        super(SupportUser, self).__init__(_data_in)

        self['user_id'] = _user_id
        self['mailAliases'] = [
            MailAlias(alias) for alias in self['mailAliases']
        ]
        self['passwords'] = [
            Password(password) for password in self['passwords']
        ]
        self['tou'] = [ToU(tou) for tou in self['tou']]
Example #11
0
    def setUp(self):
        super(AppTests, self).setUp()

        self.test_user_eppn = 'hubba-bubba'
        self.test_user_nin = '200001023456'
        self.mock_address = OrderedDict([
            (u'Name',
             OrderedDict([(u'GivenNameMarking', u'20'),
                          (u'GivenName', u'Testaren Test'),
                          (u'Surname', u'Testsson')])),
            (u'OfficialAddress',
             OrderedDict([(u'Address2', u'\xd6RGATAN 79 LGH 10'),
                          (u'PostalCode', u'12345'), (u'City', u'LANDET')]))
        ])

        self.client = self.app.test_client()

        # Replace user with one without previous proofings
        userdata = deepcopy(NEW_USER_EXAMPLE)
        del userdata['nins']
        user = User(data=userdata)
        user.modified_ts = True
        self.app.central_userdb.save(user, check_sync=False)
Example #12
0
 def test_incomplete_signup_user(self):
     """
     Test parsing the incomplete documents left in the central userdb by older Signup application.
     """
     data = {u'_id': ObjectId(),
             u'eduPersonPrincipalName': u'vohon-mufus',
             u'mail': u'*****@*****.**',
             u'mailAliases': [{u'email': u'*****@*****.**', u'verified': False}],
             }
     with self.assertRaises(UserHasNotCompletedSignup):
         User(data)
     data['subject'] = 'physical person'  # later signup added this attribute
     with self.assertRaises(UserHasNotCompletedSignup):
         User(data)
     data[u'mailAliases'][0]['verified'] = True
     data['surname'] = 'not signup-incomplete anymore'
     data['passwords'] = [{u'created_ts': datetime.datetime(2014, 9, 4, 8, 57, 7, 362000),
                           u'id': ObjectId(),
                           u'salt': u'salt',
                           u'created_by': u'dashboard'}]
     user = User(data)
     self.assertEqual(user.surname, data['surname'])
     self.assertEqual(user.passwords.to_list_of_dicts(), data['passwords'])
Example #13
0
 def test_user_with_indirectly_verified_primary_mail(self):
     """
     If a user has passwords set, the 'mail' attribute will be considered indirectly verified.
     """
     mail = u'*****@*****.**'
     data = {u'_id': ObjectId(),
             u'eduPersonPrincipalName': u'lutol-bafim',
             u'mail': mail,
             u'mailAliases': [{u'email': mail, u'verified': False}],
             u'passwords': [{u'created_ts': datetime.datetime(2014, 9, 4, 8, 57, 7, 362000),
                             u'id': ObjectId(),
                             u'salt': u'salt',
                             u'source': u'dashboard'}],
             }
     user = User(data)
     self.assertEqual(mail, user.mail_addresses.primary.email)
Example #14
0
 def test_user_tou(self):
     """
     Basic test for user ToU.
     """
     tou_dict = \
         {'id': ObjectId(),
          'event_type': 'tou_event',
          'version': '1',
          'created_by': 'unit test',
          'created_ts': True,
          }
     tou_events = ToUList([tou_dict])
     data = self.data1
     data.update({'tou': tou_events.to_list_of_dicts()})
     user = User(data)
     self.assertTrue(user.tou.has_accepted('1'))
     self.assertFalse(user.tou.has_accepted('2'))
Example #15
0
 def test_user_with_csrf_junk_in_mail_address(self):
     """
     For a long time, Dashboard leaked CSRF tokens into the mail address dicts.
     """
     mail = u'*****@*****.**'
     data = {u'_id': ObjectId(),
             u'eduPersonPrincipalName': u'test-test',
             u'mailAliases': [{u'email': mail,
             u'verified': True,
             u'csrf': u'6ae1d4e95305b72318a683883e70e3b8e302cd75'}],
             u'passwords': [{u'created_ts': datetime.datetime(2014, 9, 4, 8, 57, 7, 362000),
                             u'id': ObjectId(),
                             u'salt': u'salt',
                             u'source': u'dashboard'}],
            }
     user = User(data)
     self.assertEqual(mail, user.mail_addresses.primary.email)
Example #16
0
 def test_primary_non_verified_phone2(self):
     """
     Test that if a non verified phone number is primary, due to earlier error, then that primary flag is removed.
     """
     data = {u'_id': ObjectId(),
             u'eduPersonPrincipalName': u'pohig-test',
             u'mail': u'*****@*****.**',
             u'mailAliases': [{u'email': u'*****@*****.**', u'verified': True}],
             u'phone': [{u'number': u'+11111111111',
                         u'primary': True,
                         u'verified': False},
                        {u'number': u'+22222222222',
                         u'primary': False,
                         u'verified': True,
                         }
                        ],
             u'passwords': [{u'created_ts': datetime.datetime(2014, 6, 29, 17, 52, 37, 830000),
                             u'id': ObjectId(),
                             u'salt': u'$NDNv1H1$foo$32$32$',
                             u'source': u'dashboard'}],
             }
     user = User(data)
     self.assertEqual(user.phone_numbers.primary.number, u'+22222222222')
Example #17
0
 def test_primary_non_verified_phone(self):
         """
         Test that if a non verified phone number is primary, due to earlier error, then that primary flag is removed.
         """
         data = {u'_id': ObjectId(),
                 u'displayName': u'xxx yyy',
                 u'eduPersonPrincipalName': u'pohig-test',
                 u'givenName': u'xxx',
                 u'mail': u'*****@*****.**',
                 u'mailAliases': [{u'email': u'*****@*****.**', u'verified': True}],
                 u'phone': [{u'csrf': u'47d42078719b8377db622c3ff85b94840b483c92',
                             u'number': u'+9112345678',
                             u'primary': True,
                             u'verified': False}],
                 u'passwords': [{u'created_ts': datetime.datetime(2014, 6, 29, 17, 52, 37, 830000),
                                 u'id': ObjectId(),
                                 u'salt': u'$NDNv1H1$foo$32$32$',
                                 u'source': u'dashboard'}],
                 u'preferredLanguage': u'en',
                 u'surname': u'yyy',
                 }
         user = User(data)
         for number in user.phone_numbers.to_list():
             self.assertEqual(number.is_primary, False)
Example #18
0
 def init_data(self):
     """
     Called from the parent class, so we can extend data initialized.
     """
     test_user = User(data=NEW_UNVERIFIED_USER_EXAMPLE)  # eppn hubba-baar
     self.app.central_userdb.save(test_user, check_sync=False)
Example #19
0
class TestUser(TestCase):

    def setUp(self):
        self.data1 = {u'_id': ObjectId('547357c3d00690878ae9b620'),
                      u'eduPersonPrincipalName': u'guvat-nalif',
                      u'mail': u'*****@*****.**',
                      u'mailAliases': [{u'added_timestamp': datetime.datetime(2014, 12, 18, 11, 25, 19, 804000),
                                        u'email': u'*****@*****.**',
                                        u'verified': True}],
                      u'passwords': [{u'created_ts': datetime.datetime(2014, 11, 24, 16, 22, 49, 188000),
                                      u'id': ObjectId('54735b588a7d2a2c4ec3e7d0'),
                                      u'salt': u'$NDNv1H1$315d7$32$32$',
                                      u'source': u'dashboard'}],
                      u'norEduPersonNIN': [u'197801012345'],
                      u'subject': u'physical person',
                      u'eduPersonEntitlement': [u'http://foo.example.org'],
                      u'preferredLanguage': u'en',
                      }
        self.user1 = User(self.data1)

        self.data2 = {u'_id': ObjectId('549190b5d00690878ae9b622'),
                      u'displayName': u'Some \xf6ne',
                      u'eduPersonPrincipalName': u'birub-gagoz',
                      u'givenName': u'Some',
                      u'mail': u'*****@*****.**',
                      u'mailAliases': [{u'email': u'*****@*****.**',
                                        u'verified': True},
                                       {u'added_timestamp': datetime.datetime(2014, 12, 17, 14, 35, 14, 728000),
                                        u'email': u'*****@*****.**',
                                        u'verified': True}],
                      u'mobile': [{u'added_timestamp': datetime.datetime(2014, 12, 18, 9, 11, 35, 78000),
                                   u'mobile': u'+46702222222',
                                   u'primary': True,
                                   u'verified': True}],
                      u'passwords': [{u'created_ts': datetime.datetime(2015, 2, 11, 13, 58, 42, 327000),
                                      u'id': ObjectId('54db60128a7d2a26e8690cda'),
                                      u'salt': u'$NDNv1H1$db011fc$32$32$',
                                      u'source': u'dashboard'}],
                      u'preferredLanguage': u'sv',
                      u'surname': u'\xf6ne',
                      u'subject': u'physical person'}
        self.user2 = User(self.data2)

    def test_user_id(self):
        self.assertEqual(self.user1.user_id, self.data1['_id'])

    def test_eppn(self):
        self.assertEqual(self.user1.eppn, self.data1['eduPersonPrincipalName'])

    def test_given_name(self):
        self.assertEqual(self.user2.given_name, self.data2['givenName'])

    def test_display_name(self):
        self.assertEqual(self.user2.display_name, self.data2['displayName'])

    def test_surname(self):
        self.assertEqual(self.user2.surname, self.data2['surname'])

    def test_mail_addresses(self):
        self.assertEqual(self.user1.mail_addresses.primary.email, self.data1['mailAliases'][0]['email'])

    def test_mail_addresses_to_old_userdb_format(self):
        """
        Test that we get back a dict identical to the one we put in for old-style userdb data.
        """
        to_dict_result = self.user1.mail_addresses.to_list_of_dicts(old_userdb_format=True)
        self.assertEqual(to_dict_result, self.data1['mailAliases'])

    def test_phone_numbers(self):
        """
        Test that we get back a dict identical to the one we put in for old-style userdb data.
        """
        to_dict_result = self.user2.phone_numbers.to_list_of_dicts(old_userdb_format=True)
        self.assertEqual(to_dict_result, self.data2['mobile'])

    def test_passwords(self):
        """
        Test that we get back a dict identical to the one we put in for old-style userdb data.
        """
        self.assertEqual(self.user1.passwords.to_list_of_dicts(old_userdb_format=True), self.data1['passwords'])

    def test_obsolete_attributes(self):
        """
        Test that some obsolete attributes don't cause parse failures.
        """
        data = self.data1
        data['postalAddress'] = {'foo': 'bar'}
        data['date'] = 'anything'
        data['csrf'] = 'long and secret string'
        user = User(data)
        self.assertEqual(self.user1._data, user._data)

    def test_unknown_attributes(self):
        """
        Test parsing a document with unknown data in it.
        """
        data = self.data1
        data['unknown_attribute'] = 'something'
        user = User(data, raise_on_unknown=False)
        self.assertEqual(data['_id'], user.user_id)

        with self.assertRaises(UserHasUnknownData):
            User(data, raise_on_unknown=True)

    def test_incomplete_signup_user(self):
        """
        Test parsing the incomplete documents left in the central userdb by older Signup application.
        """
        data = {u'_id': ObjectId(),
                u'eduPersonPrincipalName': u'vohon-mufus',
                u'mail': u'*****@*****.**',
                u'mailAliases': [{u'email': u'*****@*****.**', u'verified': False}],
                }
        with self.assertRaises(UserHasNotCompletedSignup):
            User(data)
        data['subject'] = 'physical person'  # later signup added this attribute
        with self.assertRaises(UserHasNotCompletedSignup):
            User(data)
        data[u'mailAliases'][0]['verified'] = True
        data['surname'] = 'not signup-incomplete anymore'
        data['passwords'] = [{u'created_ts': datetime.datetime(2014, 9, 4, 8, 57, 7, 362000),
                              u'id': ObjectId(),
                              u'salt': u'salt',
                              u'created_by': u'dashboard'}]
        user = User(data)
        self.assertEqual(user.surname, data['surname'])
        self.assertEqual(user.passwords.to_list_of_dicts(), data['passwords'])

    def test_revoked_user(self):
        """
        Test ability to identify revoked users.
        """
        data = {u'_id': ObjectId(),
                u'eduPersonPrincipalName': u'binib-mufus',
                u'revoked_ts': datetime.datetime(2015, 5, 26, 8, 33, 56, 826000),
                }
        with self.assertRaises(UserIsRevoked):
            User(data)

    def test_user_with_no_primary_mail(self):
        mail = u'*****@*****.**'
        data = {u'_id': ObjectId(),
                u'eduPersonPrincipalName': u'lutol-bafim',
                u'mailAliases': [{u'email': mail, u'verified': True}],
                u'passwords': [{u'created_ts': datetime.datetime(2014, 9, 4, 8, 57, 7, 362000),
                                u'id': ObjectId(),
                                u'salt': u'salt',
                                u'source': u'dashboard'}],
                }
        user = User(data)
        self.assertEqual(mail, user.mail_addresses.primary.email)

    def test_user_with_indirectly_verified_primary_mail(self):
        """
        If a user has passwords set, the 'mail' attribute will be considered indirectly verified.
        """
        mail = u'*****@*****.**'
        data = {u'_id': ObjectId(),
                u'eduPersonPrincipalName': u'lutol-bafim',
                u'mail': mail,
                u'mailAliases': [{u'email': mail, u'verified': False}],
                u'passwords': [{u'created_ts': datetime.datetime(2014, 9, 4, 8, 57, 7, 362000),
                                u'id': ObjectId(),
                                u'salt': u'salt',
                                u'source': u'dashboard'}],
                }
        user = User(data)
        self.assertEqual(mail, user.mail_addresses.primary.email)

    def test_user_with_csrf_junk_in_mail_address(self):
        """
        For a long time, Dashboard leaked CSRF tokens into the mail address dicts.
        """
        mail = u'*****@*****.**'
        data = {u'_id': ObjectId(),
                u'eduPersonPrincipalName': u'test-test',
                u'mailAliases': [{u'email': mail,
                u'verified': True,
                u'csrf': u'6ae1d4e95305b72318a683883e70e3b8e302cd75'}],
                u'passwords': [{u'created_ts': datetime.datetime(2014, 9, 4, 8, 57, 7, 362000),
                                u'id': ObjectId(),
                                u'salt': u'salt',
                                u'source': u'dashboard'}],
               }
        user = User(data)
        self.assertEqual(mail, user.mail_addresses.primary.email)

    def test_to_dict(self):
        """
        Test that User objects can be recreated.
        """
        d1 = self.user1.to_dict()
        u2 = User(d1)
        d2 = u2.to_dict()
        self.assertEqual(d1, d2)

    def test_to_dict_old_format(self):
        """
        Test that User objects can be recreated.
        """
        d1 = self.user1.to_dict(old_userdb_format=True)
        u2 = User(d1)
        d2 = u2.to_dict(old_userdb_format=True)
        self.assertEqual(d1, d2)

    def test_modified_ts(self):
        """
        Test the modified_ts property.
        """
        # ensure known starting point
        self.assertIsNone(self.user1.modified_ts)
        # set to current time
        self.user1.modified_ts = True
        _time1 = self.user1.modified_ts
        self.assertIsInstance(_time1, datetime.datetime)
        # Setting existing value to None should be ignored
        self.user1.modified_ts = None
        self.assertEqual(_time1, self.user1.modified_ts)
        # update to current time
        self.user1.modified_ts = True
        _time2 = self.user1.modified_ts
        self.assertNotEqual(_time1, _time2)
        # set to a datetime instance
        self.user1.modified_ts = _time1
        self.assertEqual(_time1, self.user1.modified_ts)

    def test_two_unverified_non_primary_phones(self):
        """
        Test that the first entry in the `phone' list is chosen as primary when none are verified.
        """
        number1 = u'+9112345678'
        number2 = u'+9123456789'
        data = {u'_id': ObjectId(),
                u'displayName': u'xxx yyy',
                u'eduPersonPrincipalName': u'pohig-test',
                u'givenName': u'xxx',
                u'mail': u'*****@*****.**',
                u'mailAliases': [{u'email': u'*****@*****.**', u'verified': True}],
                u'phone': [{u'csrf': u'47d42078719b8377db622c3ff85b94840b483c92',
                             u'number': number1,
                             u'primary': False,
                             u'verified': False},
                            {u'csrf': u'47d42078719b8377db622c3ff85b94840b483c92',
                             u'number': number2,
                             u'primary': False,
                             u'verified': False}],
                u'passwords': [{u'created_ts': datetime.datetime(2014, 6, 29, 17, 52, 37, 830000),
                                u'id': ObjectId(),
                                u'salt': u'$NDNv1H1$foo$32$32$',
                                u'source': u'dashboard'}],
                u'preferredLanguage': u'en',
                u'surname': u'yyy',
                }
        user = User(data)
        self.assertEqual(user.phone_numbers.primary, None)

    def test_two_non_primary_phones(self):
        """
        Test that the first verified number is chosen as primary, if there is a verified number.
        """
        number1 = u'+9112345678'
        number2 = u'+9123456789'
        data = {u'_id': ObjectId(),
                u'displayName': u'xxx yyy',
                u'eduPersonPrincipalName': u'pohig-test',
                u'givenName': u'xxx',
                u'mail': u'*****@*****.**',
                u'mailAliases': [{u'email': u'*****@*****.**', u'verified': True}],
                u'phone': [{u'csrf': u'47d42078719b8377db622c3ff85b94840b483c92',
                             u'number': number1,
                             u'primary': False,
                             u'verified': False},
                            {u'csrf': u'47d42078719b8377db622c3ff85b94840b483c92',
                             u'number': number2,
                             u'primary': False,
                             u'verified': True}],
                u'passwords': [{u'created_ts': datetime.datetime(2014, 6, 29, 17, 52, 37, 830000),
                                u'id': ObjectId(),
                                u'salt': u'$NDNv1H1$foo$32$32$',
                                u'source': u'dashboard'}],
                u'preferredLanguage': u'en',
                u'surname': u'yyy',
                }
        user = User(data)
        self.assertEqual(user.phone_numbers.primary.number, number2)

    def test_primary_non_verified_phone(self):
            """
            Test that if a non verified phone number is primary, due to earlier error, then that primary flag is removed.
            """
            data = {u'_id': ObjectId(),
                    u'displayName': u'xxx yyy',
                    u'eduPersonPrincipalName': u'pohig-test',
                    u'givenName': u'xxx',
                    u'mail': u'*****@*****.**',
                    u'mailAliases': [{u'email': u'*****@*****.**', u'verified': True}],
                    u'phone': [{u'csrf': u'47d42078719b8377db622c3ff85b94840b483c92',
                                u'number': u'+9112345678',
                                u'primary': True,
                                u'verified': False}],
                    u'passwords': [{u'created_ts': datetime.datetime(2014, 6, 29, 17, 52, 37, 830000),
                                    u'id': ObjectId(),
                                    u'salt': u'$NDNv1H1$foo$32$32$',
                                    u'source': u'dashboard'}],
                    u'preferredLanguage': u'en',
                    u'surname': u'yyy',
                    }
            user = User(data)
            for number in user.phone_numbers.to_list():
                self.assertEqual(number.is_primary, False)

    def test_primary_non_verified_phone2(self):
        """
        Test that if a non verified phone number is primary, due to earlier error, then that primary flag is removed.
        """
        data = {u'_id': ObjectId(),
                u'eduPersonPrincipalName': u'pohig-test',
                u'mail': u'*****@*****.**',
                u'mailAliases': [{u'email': u'*****@*****.**', u'verified': True}],
                u'phone': [{u'number': u'+11111111111',
                            u'primary': True,
                            u'verified': False},
                           {u'number': u'+22222222222',
                            u'primary': False,
                            u'verified': True,
                            }
                           ],
                u'passwords': [{u'created_ts': datetime.datetime(2014, 6, 29, 17, 52, 37, 830000),
                                u'id': ObjectId(),
                                u'salt': u'$NDNv1H1$foo$32$32$',
                                u'source': u'dashboard'}],
                }
        user = User(data)
        self.assertEqual(user.phone_numbers.primary.number, u'+22222222222')

    def test_user_tou(self):
        """
        Basic test for user ToU.
        """
        tou_dict = \
            {'id': ObjectId(),
             'event_type': 'tou_event',
             'version': '1',
             'created_by': 'unit test',
             'created_ts': True,
             }
        tou_events = ToUList([tou_dict])
        data = self.data1
        data.update({'tou': tou_events.to_list_of_dicts()})
        user = User(data)
        self.assertTrue(user.tou.has_accepted('1'))
        self.assertFalse(user.tou.has_accepted('2'))