1from seahub.profile.models import Profile, DuplicatedContactEmailError
2from seahub.test_utils import BaseTestCase
3
4
5class ProfileManagerTest(BaseTestCase):
6    def setUp(self):
7        pass
8
9    def test_get_username_by_contact_email(self):
10        assert Profile.objects.get_username_by_contact_email('a@a.com') is None
11
12        user1 = self.user.username
13        Profile.objects.add_or_update(user1, contact_email='a@a.com')
14        assert Profile.objects.get_username_by_contact_email('a@a.com') == user1
15
16        # user2 = self.admin.username
17        # Profile.objects.add_or_update(user2, contact_email='a@a.com')
18        # assert Profile.objects.get_username_by_contact_email('a@a.com') is None
19
20    def test_convert_login_str_to_username(self):
21        s = Profile.objects
22        assert s.convert_login_str_to_username('a@a.com') == 'a@a.com'
23
24        Profile.objects.add_or_update(username='a@a.com', login_id='aaa')
25        assert s.convert_login_str_to_username('a@a.com') == 'a@a.com'
26        assert s.convert_login_str_to_username('aaa') == 'a@a.com'
27
28        Profile.objects.add_or_update(username='a@a.com', contact_email='a+1@a.com')
29        assert s.convert_login_str_to_username('a@a.com') == 'a@a.com'
30        assert s.convert_login_str_to_username('aaa') == 'a@a.com'
31        assert s.convert_login_str_to_username('a+1@a.com') == 'a@a.com'
32
33    def test_get_contact_email_by_user(self):
34        # no profile for user, contact email should be username
35        username = self.user.username
36        assert username == Profile.objects.get_contact_email_by_user(username)
37
38        # user has profile, but no contact email, contact email should be username
39        p = Profile.objects.add_or_update(username, 'nickname')
40        assert username == Profile.objects.get_contact_email_by_user(username)
41
42        # user has profile, and have contact email
43        p.contact_email = 'contact@foo.com'
44        p.save()
45        assert 'contact@foo.com' == Profile.objects.get_contact_email_by_user(username)
46
47    def test_add_or_update(self):
48        username = self.user.username
49        profiles = Profile.objects.filter(user=username)
50        for profile in profiles:
51            profile.delete()
52
53        profile = Profile.objects.add_or_update(username, 'nickname',
54                                                intro='hello', lang_code='ch',
55                                                login_id=username,
56                                                contact_email=username,
57                                                institution='test')
58        assert profile.nickname == 'nickname'
59        assert profile.user == username
60        assert profile.intro == 'hello'
61        assert profile.lang_code == 'ch'
62        assert profile.login_id == username
63        assert profile.contact_email == username
64        assert profile.institution == 'test'
65
66        # test whether other will be changed when some one updated
67        profile = Profile.objects.add_or_update(username, 'nick')
68        assert profile.nickname == 'nick'
69        assert profile.user == username
70        assert profile.intro == 'hello'
71        assert profile.lang_code == 'ch'
72        assert profile.login_id == username
73        assert profile.contact_email == username
74        assert profile.institution == 'test'
75
76        profile = Profile.objects.add_or_update(username, intro='intro')
77        assert profile.nickname == 'nick'
78        assert profile.user == username
79        assert profile.intro == 'intro'
80        assert profile.lang_code == 'ch'
81        assert profile.login_id == username
82        assert profile.contact_email == username
83        assert profile.institution == 'test'
84
85        profile = Profile.objects.add_or_update(username, lang_code='en')
86        assert profile.nickname == 'nick'
87        assert profile.user == username
88        assert profile.intro == 'intro'
89        assert profile.lang_code == 'en'
90        assert profile.login_id == username
91        assert profile.contact_email == username
92        assert profile.institution == 'test'
93
94        profile = Profile.objects.add_or_update(username, login_id='test@test.com')
95        assert profile.nickname == 'nick'
96        assert profile.user == username
97        assert profile.intro == 'intro'
98        assert profile.lang_code == 'en'
99        assert profile.login_id == 'test@test.com'
100        assert profile.contact_email == username
101        assert profile.institution == 'test'
102
103        profile = Profile.objects.add_or_update(username, contact_email='test@contact.com')
104        assert profile.nickname == 'nick'
105        assert profile.user == username
106        assert profile.intro == 'intro'
107        assert profile.lang_code == 'en'
108        assert profile.login_id == 'test@test.com'
109        assert profile.contact_email == 'test@contact.com'
110        assert profile.institution == 'test'
111
112        profile = Profile.objects.add_or_update(username, institution='insti')
113        assert profile.nickname == 'nick'
114        assert profile.user == username
115        assert profile.intro == 'intro'
116        assert profile.lang_code == 'en'
117        assert profile.login_id == 'test@test.com'
118        assert profile.contact_email == 'test@contact.com'
119        assert profile.institution == 'insti'
120
121    def test_add_or_update_with_empty(self):
122        username = self.user.username
123        profiles = Profile.objects.filter(user=username)
124        for profile in profiles:
125            profile.delete()
126
127        profile = Profile.objects.add_or_update(username, 'nickname',
128                                                intro='hello', lang_code='ch',
129                                                login_id=username,
130                                                contact_email=username,
131                                                institution='test')
132        assert profile.nickname == 'nickname'
133        assert profile.user == username
134        assert profile.intro == 'hello'
135        assert profile.lang_code == 'ch'
136        assert profile.login_id == username
137        assert profile.contact_email == username
138        assert profile.institution == 'test'
139
140        profile = Profile.objects.add_or_update(username, '')
141        assert profile.nickname == ''
142
143        profile = Profile.objects.add_or_update(username, intro='')
144        assert profile.intro == ''
145
146        profile = Profile.objects.add_or_update(username, lang_code='')
147        assert profile.lang_code == ''
148
149        profile = Profile.objects.add_or_update(username, login_id='')
150        assert profile.login_id == ''
151
152        profile = Profile.objects.add_or_update(username, contact_email='')
153        assert profile.contact_email == ''
154
155    def test_duplicated_contact_email(self, ):
156        profile = Profile.objects.add_or_update('test@test.com', '',
157                                                contact_email='a@a.com')
158
159        try:
160            _ = Profile.objects.add_or_update('1@1.com', '',
161                                              contact_email='a@a.com')
162        except DuplicatedContactEmailError:
163            assert True
164        else:
165            assert False
166
167    def test_updated_contact_email(self, ):
168        _ = Profile.objects.add_or_update('1@1.com', '',
169                                          contact_email='a@a.com')
170
171        username = self.user.username
172        profile = Profile.objects.add_or_update(username, '',
173                                                contact_email='b@b.com')
174
175        try:
176            Profile.objects.update_contact_email(username, contact_email='a@a.com')
177        except DuplicatedContactEmailError:
178            assert True
179        else:
180            assert False
181