entities/test/unittest_base.py
changeset 2968 0e3460341023
parent 2819 b864288fd316
parent 2920 64322aa83a1d
child 3163 edfe43ceaa35
equal deleted inserted replaced
2902:dd9f2dd02f85 2968:0e3460341023
    55         self.assertEquals(e.name(), u'bouah')
    55         self.assertEquals(e.name(), u'bouah')
    56         self.execute(u'SET X surname "lôt" WHERE X is CWUser, X login "member"')
    56         self.execute(u'SET X surname "lôt" WHERE X is CWUser, X login "member"')
    57         self.assertEquals(e.dc_title(), 'member')
    57         self.assertEquals(e.dc_title(), 'member')
    58         self.assertEquals(e.name(), u'bouah lôt')
    58         self.assertEquals(e.name(), u'bouah lôt')
    59 
    59 
    60 
       
    61 class StateAndTransitionsTC(BaseEntityTC):
       
    62 
       
    63     def test_transitions(self):
       
    64         user = self.entity('CWUser X')
       
    65         e = self.entity('State S WHERE S name "activated"')
       
    66         trs = list(e.transitions(user))
       
    67         self.assertEquals(len(trs), 1)
       
    68         self.assertEquals(trs[0].name, u'deactivate')
       
    69         self.assertEquals(trs[0].destination().name, u'deactivated')
       
    70         self.assert_(user.can_pass_transition('deactivate'))
       
    71         self.assert_(not user.can_pass_transition('activate'))
       
    72         # test a std user get no possible transition
       
    73         self.login('member')
       
    74         # fetch the entity using the new session
       
    75         e = self.entity('State S WHERE S name "activated"')
       
    76         trs = list(e.transitions(user))
       
    77         self.assertEquals(len(trs), 0)
       
    78         user = self.entity('CWUser X')
       
    79         self.assert_(not user.can_pass_transition('deactivate'))
       
    80         self.assert_(not user.can_pass_transition('activate'))
       
    81 
       
    82     def test_transitions_with_dest_specfied(self):
       
    83         user = self.entity('CWUser X')
       
    84         e = self.entity('State S WHERE S name "activated"')
       
    85         e2 = self.entity('State S WHERE S name "deactivated"')
       
    86         trs = list(e.transitions(user, e2.eid))
       
    87         self.assertEquals(len(trs), 1)
       
    88         self.assertEquals(trs[0].name, u'deactivate')
       
    89         self.assertEquals(trs[0].destination().name, u'deactivated')
       
    90         trs = list(e.transitions(user, e.eid))
       
    91         self.assertEquals(len(trs), 0)
       
    92 
       
    93     def test_transitions_maybe_passed(self):
       
    94         self.execute('INSERT RQLExpression X: X exprtype "ERQLExpression", '
       
    95                      'X expression "X owned_by U", T condition X '
       
    96                      'WHERE T name "deactivate"')
       
    97         self._test_deactivated()
       
    98 
       
    99     def test_transitions_maybe_passed_using_has_update_perm(self):
       
   100         self.execute('INSERT RQLExpression X: X exprtype "ERQLExpression", '
       
   101                      'X expression "U has_update_permission X", T condition X '
       
   102                      'WHERE T name "deactivate"')
       
   103         self._test_deactivated()
       
   104 
       
   105 
       
   106     def _test_deactivated(self):
       
   107         ueid = self.create_user('toto').eid
       
   108         self.create_user('tutu')
       
   109         cnx = self.login('tutu')
       
   110         cu = cnx.cursor()
       
   111         self.assertRaises(ValidationError,
       
   112                           cu.execute, 'SET X in_state S WHERE X eid %(x)s, S name "deactivated"',
       
   113                           {'x': ueid}, 'x')
       
   114         cnx.close()
       
   115         cnx = self.login('toto')
       
   116         cu = cnx.cursor()
       
   117         cu.execute('SET X in_state S WHERE X eid %(x)s, S name "deactivated"',
       
   118                    {'x': ueid}, 'x')
       
   119         cnx.commit()
       
   120         self.assertRaises(ValidationError,
       
   121                           cu.execute, 'SET X in_state S WHERE X eid %(x)s, S name "activated"',
       
   122                           {'x': ueid}, 'x')
       
   123 
       
   124 
       
   125     def test_transitions_selection(self):
       
   126         """
       
   127         ------------------------  tr1    -----------------
       
   128         | state1 (CWGroup, Bookmark) | ------> | state2 (CWGroup) |
       
   129         ------------------------         -----------------
       
   130                   |  tr2    ------------------
       
   131                   `------>  | state3 (Bookmark) |
       
   132                             ------------------
       
   133         """
       
   134         state1 = self.add_entity('State', name=u'state1')
       
   135         state2 = self.add_entity('State', name=u'state2')
       
   136         state3 = self.add_entity('State', name=u'state3')
       
   137         tr1 = self.add_entity('Transition', name=u'tr1')
       
   138         tr2 = self.add_entity('Transition', name=u'tr2')
       
   139         self.execute('SET X state_of Y WHERE X eid in (%s, %s), Y is CWEType, Y name "CWGroup"' %
       
   140                       (state1.eid, state2.eid))
       
   141         self.execute('SET X state_of Y WHERE X eid in (%s, %s), Y is CWEType, Y name "Bookmark"' %
       
   142                       (state1.eid, state3.eid))
       
   143         self.execute('SET X transition_of Y WHERE X eid %s, Y name "CWGroup"' % tr1.eid)
       
   144         self.execute('SET X transition_of Y WHERE X eid %s, Y name "Bookmark"' % tr2.eid)
       
   145         self.execute('SET X allowed_transition Y WHERE X eid %s, Y eid %s' %
       
   146                       (state1.eid, tr1.eid))
       
   147         self.execute('SET X allowed_transition Y WHERE X eid %s, Y eid %s' %
       
   148                       (state1.eid, tr2.eid))
       
   149         self.execute('SET X destination_state Y WHERE X eid %s, Y eid %s' %
       
   150                       (tr1.eid, state2.eid))
       
   151         self.execute('SET X destination_state Y WHERE X eid %s, Y eid %s' %
       
   152                       (tr2.eid, state3.eid))
       
   153         self.execute('SET X initial_state Y WHERE Y eid %s, X name "CWGroup"' % state1.eid)
       
   154         self.execute('SET X initial_state Y WHERE Y eid %s, X name "Bookmark"' % state1.eid)
       
   155         group = self.add_entity('CWGroup', name=u't1')
       
   156         transitions = list(state1.transitions(group))
       
   157         self.assertEquals(len(transitions), 1)
       
   158         self.assertEquals(transitions[0].name, 'tr1')
       
   159         bookmark = self.add_entity('Bookmark', title=u'111', path=u'/view')
       
   160         transitions = list(state1.transitions(bookmark))
       
   161         self.assertEquals(len(transitions), 1)
       
   162         self.assertEquals(transitions[0].name, 'tr2')
       
   163 
       
   164 
       
   165     def test_transitions_selection2(self):
       
   166         """
       
   167         ------------------------  tr1 (Bookmark)   -----------------------
       
   168         | state1 (CWGroup, Bookmark) | -------------> | state2 (CWGroup,Bookmark) |
       
   169         ------------------------                -----------------------
       
   170                   |  tr2 (CWGroup)                     |
       
   171                   `---------------------------------/
       
   172         """
       
   173         state1 = self.add_entity('State', name=u'state1')
       
   174         state2 = self.add_entity('State', name=u'state2')
       
   175         tr1 = self.add_entity('Transition', name=u'tr1')
       
   176         tr2 = self.add_entity('Transition', name=u'tr2')
       
   177         self.execute('SET X state_of Y WHERE X eid in (%s, %s), Y is CWEType, Y name "CWGroup"' %
       
   178                       (state1.eid, state2.eid))
       
   179         self.execute('SET X state_of Y WHERE X eid in (%s, %s), Y is CWEType, Y name "Bookmark"' %
       
   180                       (state1.eid, state2.eid))
       
   181         self.execute('SET X transition_of Y WHERE X eid %s, Y name "CWGroup"' % tr1.eid)
       
   182         self.execute('SET X transition_of Y WHERE X eid %s, Y name "Bookmark"' % tr2.eid)
       
   183         self.execute('SET X allowed_transition Y WHERE X eid %s, Y eid %s' %
       
   184                       (state1.eid, tr1.eid))
       
   185         self.execute('SET X allowed_transition Y WHERE X eid %s, Y eid %s' %
       
   186                       (state1.eid, tr2.eid))
       
   187         self.execute('SET X destination_state Y WHERE X eid %s, Y eid %s' %
       
   188                       (tr1.eid, state2.eid))
       
   189         self.execute('SET X destination_state Y WHERE X eid %s, Y eid %s' %
       
   190                       (tr2.eid, state2.eid))
       
   191         self.execute('SET X initial_state Y WHERE Y eid %s, X name "CWGroup"' % state1.eid)
       
   192         self.execute('SET X initial_state Y WHERE Y eid %s, X name "Bookmark"' % state1.eid)
       
   193         group = self.add_entity('CWGroup', name=u't1')
       
   194         transitions = list(state1.transitions(group))
       
   195         self.assertEquals(len(transitions), 1)
       
   196         self.assertEquals(transitions[0].name, 'tr1')
       
   197         bookmark = self.add_entity('Bookmark', title=u'111', path=u'/view')
       
   198         transitions = list(state1.transitions(bookmark))
       
   199         self.assertEquals(len(transitions), 1)
       
   200         self.assertEquals(transitions[0].name, 'tr2')
       
   201 
       
   202 
       
   203 class EmailAddressTC(BaseEntityTC):
    60 class EmailAddressTC(BaseEntityTC):
   204     def test_canonical_form(self):
    61     def test_canonical_form(self):
   205         eid1 = self.execute('INSERT EmailAddress X: X address "maarten.ter.huurne@philips.com"')[0][0]
    62         eid1 = self.execute('INSERT EmailAddress X: X address "maarten.ter.huurne@philips.com"')[0][0]
   206         eid2 = self.execute('INSERT EmailAddress X: X address "maarten@philips.com", X canonical TRUE')[0][0]
    63         eid2 = self.execute('INSERT EmailAddress X: X address "maarten@philips.com", X canonical TRUE')[0][0]
   207         self.execute('SET X identical_to Y WHERE X eid %s, Y eid %s' % (eid1, eid2))
    64         self.execute('SET X identical_to Y WHERE X eid %s, Y eid %s' % (eid1, eid2))
   231 
    88 
   232     def test_complete(self):
    89     def test_complete(self):
   233         e = self.entity('CWUser X WHERE X login "admin"')
    90         e = self.entity('CWUser X WHERE X login "admin"')
   234         e.complete()
    91         e.complete()
   235 
    92 
   236 
       
   237     def test_matching_groups(self):
    93     def test_matching_groups(self):
   238         e = self.entity('CWUser X WHERE X login "admin"')
    94         e = self.entity('CWUser X WHERE X login "admin"')
   239         self.failUnless(e.matching_groups('managers'))
    95         self.failUnless(e.matching_groups('managers'))
   240         self.failIf(e.matching_groups('xyz'))
    96         self.failIf(e.matching_groups('xyz'))
   241         self.failUnless(e.matching_groups(('xyz', 'managers')))
    97         self.failUnless(e.matching_groups(('xyz', 'managers')))
   242         self.failIf(e.matching_groups(('xyz', 'abcd')))
    98         self.failIf(e.matching_groups(('xyz', 'abcd')))
   243 
       
   244     def test_workflow_base(self):
       
   245         e = self.create_user('toto')
       
   246         self.assertEquals(e.state, 'activated')
       
   247         activatedeid = self.execute('State X WHERE X name "activated"')[0][0]
       
   248         deactivatedeid = self.execute('State X WHERE X name "deactivated"')[0][0]
       
   249         e.change_state(deactivatedeid, u'deactivate 1')
       
   250         self.commit()
       
   251         e.change_state(activatedeid, u'activate 1')
       
   252         self.commit()
       
   253         e.change_state(deactivatedeid, u'deactivate 2')
       
   254         self.commit()
       
   255         # get a fresh user to avoid potential cache issues
       
   256         e = self.entity('CWUser X WHERE X eid %s' % e.eid)
       
   257         self.assertEquals([tr.comment for tr in e.reverse_wf_info_for],
       
   258                           [None, 'deactivate 1', 'activate 1', 'deactivate 2'])
       
   259         self.assertEquals(e.latest_trinfo().comment, 'deactivate 2')
       
   260 
    99 
   261 
   100 
   262 class InterfaceTC(CubicWebTC):
   101 class InterfaceTC(CubicWebTC):
   263 
   102 
   264     def test_nonregr_subclasses_and_mixins_interfaces(self):
   103     def test_nonregr_subclasses_and_mixins_interfaces(self):