/plone/app/vocabularies/tests/test_principals.py

https://github.com/plone/plone.app.vocabularies · Python · 490 lines · 365 code · 84 blank · 41 comment · 29 complexity · 65b5df67e888b4647a29099b3f567fd2 MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. from plone.app.vocabularies.testing import PAVocabularies_INTEGRATION_TESTING
  3. import mock
  4. import unittest
  5. class PrincipalsTest(unittest.TestCase):
  6. layer = PAVocabularies_INTEGRATION_TESTING
  7. def setUp(self):
  8. self.portal = self.layer['portal']
  9. def _make_user(self, userid, fullname):
  10. user = self.portal['acl_users']._doAddUser(
  11. userid, 'secret', ['Member'], []
  12. )
  13. user.setProperties(fullname=fullname)
  14. def _make_group(self, groupid, title):
  15. self.portal['acl_users']._doAddGroup(groupid, [], title=title)
  16. def test_empty_principals_vocabulary(self):
  17. from plone.app.vocabularies.principals import PrincipalsVocabulary
  18. vocab = PrincipalsVocabulary([])
  19. vocab.principal_source = 'user'
  20. # basic data
  21. self.assertEqual(vocab.principal_source, 'user')
  22. self.assertEqual(vocab._acl_users, self.portal['acl_users'])
  23. def test_pas_connectivity_user(self):
  24. self._make_user('user1', 'User One')
  25. from plone.app.vocabularies.principals import PrincipalsVocabulary
  26. vocab = PrincipalsVocabulary([])
  27. vocab.principal_source = 'user'
  28. # test 1
  29. vuser = vocab._get_principal_from_source('user1')
  30. self.assertEqual(vuser.getId(), 'user1')
  31. # test 2
  32. term = vocab.getTerm('user1')
  33. self.assertEqual(term.value, 'user1')
  34. self.assertEqual(term.token, 'user1')
  35. self.assertEqual(term.title, 'User One')
  36. with self.assertRaises(LookupError):
  37. term = vocab.getTerm('user:non-existing')
  38. with self.assertRaises(LookupError):
  39. term = vocab.getTerm('non-existing')
  40. def test_pas_connectivity_group(self):
  41. self._make_group('group1', 'Group One')
  42. from plone.app.vocabularies.principals import PrincipalsVocabulary
  43. vocab = PrincipalsVocabulary([])
  44. vocab.principal_source = 'group'
  45. # test 1
  46. vgroup = vocab._get_principal_from_source('group1')
  47. self.assertEqual(vgroup.getId(), 'group1')
  48. # test 2
  49. term = vocab.getTerm('group1')
  50. self.assertEqual(term.value, 'group1')
  51. self.assertEqual(term.token, 'group1')
  52. self.assertEqual(term.title, 'Group One')
  53. with self.assertRaises(LookupError):
  54. term = vocab.getTerm('group:non-existing')
  55. with self.assertRaises(LookupError):
  56. term = vocab.getTerm('non-existing')
  57. def test_pas_connectivity_principal(self):
  58. self._make_user('user1', 'User One')
  59. self._make_group('group1', 'Group One')
  60. from plone.app.vocabularies.principals import PrincipalsVocabulary
  61. vocab = PrincipalsVocabulary([])
  62. vocab.principal_source = 'principal'
  63. # test 1
  64. vgroup = vocab._get_principal_from_source('user:user1')
  65. self.assertEqual(vgroup.getId(), 'user1')
  66. vgroup = vocab._get_principal_from_source('group:group1')
  67. self.assertEqual(vgroup.getId(), 'group1')
  68. # test 2
  69. term = vocab.getTerm('user:user1')
  70. self.assertEqual(term.value, 'user:user1')
  71. self.assertEqual(term.token, 'user__user1')
  72. self.assertEqual(term.title, 'User One')
  73. term = vocab.getTerm('group:group1')
  74. self.assertEqual(term.value, 'group:group1')
  75. self.assertEqual(term.token, 'group__group1')
  76. self.assertEqual(term.title, 'Group One')
  77. with self.assertRaises(LookupError):
  78. term = vocab.getTerm('user:non-existing')
  79. with self.assertRaises(LookupError):
  80. term = vocab.getTerm('group:non-existing')
  81. with self.assertRaises(LookupError):
  82. term = vocab.getTerm('non-existing')
  83. def test_populated_user(self):
  84. from zope.schema.vocabulary import SimpleTerm
  85. terms = [
  86. SimpleTerm(
  87. 'user_{0}'.format(idx),
  88. 'user{0}'.format(idx),
  89. 'User {0}'.format(idx),
  90. )
  91. for idx in range(0, 10)
  92. ]
  93. from plone.app.vocabularies.principals import PrincipalsVocabulary
  94. vocab = PrincipalsVocabulary(terms)
  95. vocab.principal_source = 'user'
  96. self.assertEqual(vocab.getTerm('user_3').value, 'user_3')
  97. self.assertEqual(vocab.getTerm('user_3').token, 'user3')
  98. self.assertEqual(vocab.getTerm('user_3').title, 'User 3')
  99. self.assertEqual(vocab.getTermByToken('user3').value, 'user_3')
  100. self.assertEqual(vocab.getTermByToken('user3').token, 'user3')
  101. self.assertEqual(vocab.getTermByToken('user3').title, 'User 3')
  102. self.assertEqual(vocab[6].value, 'user_6')
  103. self.assertEqual(
  104. ['user_2', 'user_3', 'user_4', 'user_5'],
  105. [term.value for term in vocab[2:6]],
  106. )
  107. self.assertTrue('user_2' in vocab)
  108. self.assertFalse('non-existing' in vocab)
  109. def test_populated_group(self):
  110. from zope.schema.vocabulary import SimpleTerm
  111. terms = [
  112. SimpleTerm(
  113. 'group_{0}'.format(idx),
  114. 'group{0}'.format(idx),
  115. 'Group {0}'.format(idx),
  116. )
  117. for idx in range(0, 10)
  118. ]
  119. from plone.app.vocabularies.principals import PrincipalsVocabulary
  120. vocab = PrincipalsVocabulary(terms)
  121. vocab.principal_source = 'group'
  122. self.assertEqual(vocab.getTerm('group_3').value, 'group_3')
  123. self.assertEqual(vocab.getTerm('group_3').token, 'group3')
  124. self.assertEqual(vocab.getTerm('group_3').title, 'Group 3')
  125. self.assertEqual(vocab.getTermByToken('group3').value, 'group_3')
  126. self.assertEqual(vocab.getTermByToken('group3').token, 'group3')
  127. self.assertEqual(vocab.getTermByToken('group3').title, 'Group 3')
  128. self.assertEqual(vocab[6].value, 'group_6')
  129. self.assertEqual(
  130. ['group_2', 'group_3', 'group_4', 'group_5'],
  131. [term.value for term in vocab[2:6]],
  132. )
  133. self.assertTrue('group_2' in vocab)
  134. self.assertFalse('non-existing' in vocab)
  135. def test_populated_principals(self):
  136. from zope.schema.vocabulary import SimpleTerm
  137. terms = [
  138. SimpleTerm(
  139. 'user:user_{0}'.format(idx),
  140. 'user__user{0}'.format(idx),
  141. 'User {0}'.format(idx),
  142. )
  143. for idx in range(0, 10)
  144. ]
  145. terms += [
  146. SimpleTerm(
  147. 'group:group_{0}'.format(idx),
  148. 'group__group{0}'.format(idx),
  149. 'Group {0}'.format(idx),
  150. )
  151. for idx in range(0, 10)
  152. ]
  153. from plone.app.vocabularies.principals import PrincipalsVocabulary
  154. vocab = PrincipalsVocabulary(terms)
  155. vocab.principal_source = 'principal'
  156. # users
  157. self.assertEqual(vocab.getTerm('user:user_4').value, 'user:user_4')
  158. self.assertEqual(vocab.getTerm('user:user_3').token, 'user__user3')
  159. self.assertEqual(vocab.getTerm('user:user_6').title, 'User 6')
  160. self.assertEqual(
  161. vocab.getTermByToken('user__user4').value, 'user:user_4'
  162. )
  163. self.assertEqual(
  164. vocab.getTermByToken('user__user3').token, 'user__user3'
  165. )
  166. self.assertEqual(vocab.getTermByToken('user__user6').title, 'User 6')
  167. self.assertTrue('user:user_2' in vocab)
  168. self.assertFalse('non-existing' in vocab)
  169. # groups
  170. self.assertEqual(vocab.getTerm('group:group_3').value, 'group:group_3')
  171. self.assertEqual(vocab.getTerm('group:group_3').token, 'group__group3')
  172. self.assertEqual(vocab.getTerm('group:group_3').title, 'Group 3')
  173. self.assertEqual(
  174. vocab.getTermByToken('group__group3').value, 'group:group_3'
  175. )
  176. self.assertEqual(
  177. vocab.getTermByToken('group__group3').token, 'group__group3'
  178. )
  179. self.assertEqual(
  180. vocab.getTermByToken('group__group3').title, 'Group 3'
  181. )
  182. # getitem/slice
  183. self.assertEqual(vocab[6].value, 'user:user_6')
  184. self.assertEqual(
  185. ['group:group_7', 'group:group_8', 'group:group_9'],
  186. [term.value for term in vocab[17:]],
  187. )
  188. self.assertEqual(
  189. ['user:user_8', 'user:user_9', 'group:group_0'],
  190. [term.value for term in vocab[8:11]],
  191. )
  192. # contains works too (by token)
  193. self.assertTrue('group:group_2' in vocab)
  194. self.assertFalse('non-existing' in vocab)
  195. def test_factory_user_blank(self):
  196. for idx in range(0, 10):
  197. # creates user0: 'Abc User'; user1, 'Bcd User', ...
  198. userid = 'usér{0}'.format(idx)
  199. fullname = chr(65 + idx) + chr(98 + idx) + chr(99 + idx) + ' Üser'
  200. self._make_user(userid, fullname)
  201. from plone.app.vocabularies.principals import UsersFactory
  202. factory = UsersFactory()
  203. vocab = factory(self.portal)
  204. self.assertEqual(vocab.getTerm('usér0').title, 'Abc Üser')
  205. self.assertEqual(vocab.getTerm('usér2').title, 'Cde Üser')
  206. self.assertEqual(vocab.getTermByToken('usér0').title, 'Abc Üser')
  207. self.assertEqual(vocab.getTermByToken('usér2').title, 'Cde Üser')
  208. def test_factory_user_query(self):
  209. for idx in range(0, 10):
  210. # creates user0: 'Abc User'; user1, 'Bcd User', ...
  211. userid = 'usér{0}'.format(idx)
  212. fullname = chr(65 + idx) + chr(98 + idx) + chr(99 + idx) + ' Üser'
  213. self._make_user(userid, fullname)
  214. from plone.app.vocabularies.principals import UsersFactory
  215. factory = UsersFactory()
  216. vocab = factory(self.portal, query='Cde')
  217. # reduced by query
  218. self.assertEqual([term.value for term in vocab], ['usér2'])
  219. # getTerm[ByToken] still works for all
  220. self.assertEqual(vocab.getTerm('usér0').title, 'Abc Üser')
  221. self.assertEqual(vocab.getTerm('usér2').title, 'Cde Üser')
  222. self.assertEqual(vocab.getTermByToken('usér0').title, 'Abc Üser')
  223. self.assertEqual(vocab.getTermByToken('usér2').title, 'Cde Üser')
  224. # contains works (by value)
  225. self.assertTrue('usér0' in vocab)
  226. self.assertTrue('usér2' in vocab)
  227. def test_factory_group_blank(self):
  228. for idx in range(0, 10):
  229. # creates group0: 'Abc Group'; group1, 'Bcd Group', ...
  230. groupid = 'groüp{0}'.format(idx)
  231. fullname = chr(65 + idx) + chr(98 + idx) + chr(99 + idx) + ' Gröüp'
  232. self._make_group(groupid, fullname)
  233. from plone.app.vocabularies.principals import GroupsFactory
  234. factory = GroupsFactory()
  235. vocab = factory(self.portal)
  236. self.assertEqual(vocab.getTerm('groüp0').title, 'Abc Gröüp')
  237. self.assertEqual(vocab.getTerm('groüp2').title, 'Cde Gröüp')
  238. self.assertEqual(vocab.getTermByToken('groüp0').title, 'Abc Gröüp')
  239. self.assertEqual(vocab.getTermByToken('groüp2').title, 'Cde Gröüp')
  240. def test_factory_group_query(self):
  241. for idx in range(0, 10):
  242. # creates user0: 'Abc User'; user1, 'Bcd User', ...
  243. groupid = 'groüp{0}'.format(idx)
  244. fullname = chr(65 + idx) + chr(98 + idx) + chr(99 + idx) + ' Gröüp'
  245. self._make_group(groupid, fullname)
  246. from plone.app.vocabularies.principals import GroupsFactory
  247. factory = GroupsFactory()
  248. vocab = factory(self.portal, query='Cde')
  249. # reduced by query
  250. self.assertEqual([term.value for term in vocab], ['groüp2'])
  251. # getTerm[ByToken] still works for all
  252. self.assertEqual(vocab.getTerm('groüp0').title, 'Abc Gröüp')
  253. self.assertEqual(vocab.getTerm('groüp2').title, 'Cde Gröüp')
  254. self.assertEqual(vocab.getTermByToken('groüp0').title, 'Abc Gröüp')
  255. self.assertEqual(vocab.getTermByToken('groüp2').title, 'Cde Gröüp')
  256. # contains works too (by token)
  257. self.assertTrue('groüp0' in vocab)
  258. self.assertTrue('groüp2' in vocab)
  259. def test_factory_principal_blank(self):
  260. for idx in range(0, 10):
  261. # creates user0: 'Abc User'; user1, 'Bcd User', ...
  262. userid = 'usér{0}'.format(idx)
  263. fullname = chr(65 + idx) + chr(98 + idx) + chr(99 + idx) + ' Üser'
  264. self._make_user(userid, fullname)
  265. for idx in range(0, 10):
  266. # creates group0: 'Abc Group'; group1, 'Bcd Group', ...
  267. groupid = 'groüp{0}'.format(idx)
  268. fullname = chr(65 + idx) + chr(98 + idx) + chr(99 + idx) + ' Gröüp'
  269. self._make_group(groupid, fullname)
  270. from plone.app.vocabularies.principals import PrincipalsFactory
  271. factory = PrincipalsFactory()
  272. vocab = factory(self.portal)
  273. self.assertEqual(vocab.getTerm('user:usér0').title, 'Abc Üser')
  274. self.assertEqual(vocab.getTerm('user:usér2').title, 'Cde Üser')
  275. self.assertEqual(vocab.getTerm('group:groüp0').title, 'Abc Gröüp')
  276. self.assertEqual(vocab.getTerm('group:groüp2').title, 'Cde Gröüp')
  277. self.assertEqual(vocab.getTermByToken('user__usér0').title, 'Abc Üser')
  278. self.assertEqual(vocab.getTermByToken('user__usér2').title, 'Cde Üser')
  279. self.assertEqual(vocab.getTermByToken('group__groüp0').title, 'Abc Gröüp')
  280. self.assertEqual(vocab.getTermByToken('group__groüp2').title, 'Cde Gröüp')
  281. def test_factory_principal_query(self):
  282. for idx in range(0, 10):
  283. # creates user0: 'Abc User'; user1, 'Bcd User', ...
  284. userid = 'usér{0}'.format(idx)
  285. fullname = chr(65 + idx) + chr(98 + idx) + chr(99 + idx) + ' Üser'
  286. self._make_user(userid, fullname)
  287. for idx in range(0, 10):
  288. # creates group0: 'Abc Group'; group1, 'Bcd Group', ...
  289. groupid = 'groüp{0}'.format(idx)
  290. fullname = chr(65 + idx) + chr(98 + idx) + chr(99 + idx) + ' Gröüp'
  291. self._make_group(groupid, fullname)
  292. from plone.app.vocabularies.principals import PrincipalsFactory
  293. factory = PrincipalsFactory()
  294. vocab = factory(self.portal, query='Cde')
  295. # reduced by query
  296. self.assertEqual(
  297. [term.value for term in vocab], ['group:groüp2', 'user:usér2']
  298. )
  299. # getTerm still works for all
  300. self.assertEqual(vocab.getTerm('user:usér0').title, 'Abc Üser')
  301. self.assertEqual(vocab.getTerm('user:usér2').title, 'Cde Üser')
  302. self.assertEqual(vocab.getTerm('group:groüp0').title, 'Abc Gröüp')
  303. self.assertEqual(vocab.getTerm('group:groüp2').title, 'Cde Gröüp')
  304. self.assertEqual(vocab.getTermByToken('user__usér0').title, 'Abc Üser')
  305. self.assertEqual(vocab.getTermByToken('user__usér2').title, 'Cde Üser')
  306. self.assertEqual(vocab.getTermByToken('group__groüp0').title, 'Abc Gröüp')
  307. self.assertEqual(vocab.getTermByToken('group__groüp2').title, 'Cde Gröüp')
  308. # contains works (by token)
  309. self.assertTrue('user:usér0' in vocab)
  310. self.assertTrue('user:usér2' in vocab)
  311. self.assertTrue('group:groüp0' in vocab)
  312. self.assertTrue('group:groüp2' in vocab)
  313. def test_factory_user_duplicate(self):
  314. """ For an LDAP user that has logged in at least once, we get one
  315. result each from pasldap and from mutable_properties. This should be
  316. treated as one user.
  317. """
  318. with mock.patch(
  319. 'plone.app.vocabularies.principals._get_acl_users',
  320. ) as fake_get_acl_users:
  321. fake_get_acl_users.return_value.searchUsers.return_value = (
  322. {'id': 'ldapusér',
  323. 'login': 'ldapusér',
  324. 'pluginid': 'pasldap',
  325. 'userid': 'ldapusér',
  326. 'principal_type': 'user',
  327. 'title': 'LDAP Usér'},
  328. {'id': 'ldapusér',
  329. 'login': 'ldapusér',
  330. 'title': '',
  331. 'description': '',
  332. 'email': '',
  333. 'pluginid': 'mutable_properties',
  334. 'userid': 'ldapusér',
  335. 'principal_type': 'user'},
  336. )
  337. from plone.app.vocabularies.principals import UsersFactory
  338. factory = UsersFactory()
  339. vocab = factory(self.portal)
  340. self.assertEqual(vocab.getTerm('ldapusér').title, 'LDAP Usér')
  341. def test_factory_user_conflict(self):
  342. """ In a user vocabulary, multiple results for the same principal ID
  343. but with different principal_type values indicate some problem. Raise
  344. an error.
  345. """
  346. with mock.patch(
  347. 'plone.app.vocabularies.principals._get_acl_users',
  348. ) as fake_get_acl_users:
  349. fake_get_acl_users.return_value.searchUsers.return_value = (
  350. {'id': 'ldapusér',
  351. 'login': 'ldapusér',
  352. 'pluginid': 'pasldap',
  353. 'userid': 'ldapusér',
  354. 'principal_type': 'user',
  355. 'title': 'LDAP Usér'},
  356. {'id': 'ldapusér',
  357. 'login': 'ldapusér',
  358. 'title': '',
  359. 'description': '',
  360. 'email': '',
  361. 'pluginid': 'mutable_properties',
  362. 'userid': 'ldapusér',
  363. 'principal_type': 'unknown'},
  364. )
  365. from plone.app.vocabularies.principals import UsersFactory
  366. factory = UsersFactory()
  367. self.assertRaises(
  368. ValueError,
  369. factory,
  370. self.portal,
  371. )
  372. def test_factory_principal_conflict(self):
  373. """ In a principal vocabulary, multiple results for the same principal
  374. ID but with different principal_type values can be handled because they
  375. are prefixed.
  376. """
  377. with mock.patch(
  378. 'plone.app.vocabularies.principals._get_acl_users',
  379. ) as fake_get_acl_users:
  380. fake_get_acl_users.return_value.searchUsers.return_value = (
  381. {'id': 'duplicaté',
  382. 'login': 'duplicaté',
  383. 'pluginid': 'pasldap',
  384. 'userid': 'duplicaté',
  385. 'principal_type': 'user',
  386. 'title': 'Duplicaté User'},
  387. {'id': 'duplicaté',
  388. 'login': 'duplicaté',
  389. 'title': 'Duplicaté Group',
  390. 'description': '',
  391. 'email': '',
  392. 'pluginid': 'source_groups',
  393. 'userid': 'duplicaté',
  394. 'principal_type': 'group'},
  395. )
  396. from plone.app.vocabularies.principals import PrincipalsFactory
  397. factory = PrincipalsFactory()
  398. vocab = factory(self.portal)
  399. self.assertEqual(
  400. vocab.getTerm('user:duplicaté').title,
  401. 'Duplicaté User',
  402. )
  403. self.assertEqual(
  404. vocab.getTerm('group:duplicaté').title,
  405. 'Duplicaté Group',
  406. )