doc/book/en/development/testing/index.rst
changeset 5159 2543cfa5d54a
parent 5158 5e9055b8c10a
parent 5154 834269261ae4
child 5160 27d4cab5db03
equal deleted inserted replaced
5158:5e9055b8c10a 5159:2543cfa5d54a
     1 .. -*- coding: utf-8 -*-
       
     2 
       
     3 Tests
       
     4 =====
       
     5 
       
     6 .. toctree::
       
     7    :maxdepth: 1
       
     8 
       
     9 
       
    10 Unit tests
       
    11 ----------
       
    12 
       
    13 *CubicWeb* framework provides essentially two Python test classes in the
       
    14 module `cubicweb.devtools.apptest`:
       
    15 
       
    16 * `EnvBasedTC`, to simulate a complete environment (web + repository)
       
    17 * `RepositoryBasedTC`, to simulate a repository environment only
       
    18 
       
    19 Those two classes almost have the same interface and offer numerous
       
    20 methods to write tests rapidly and efficiently.
       
    21 
       
    22 XXX FILLME describe API
       
    23 
       
    24 In most of the cases, you will inherit `EnvBasedTC` to write Unittest or
       
    25 functional tests for your entities, views, hooks, etc...
       
    26 
       
    27 Managing connections or users
       
    28 +++++++++++++++++++++++++++++
       
    29 
       
    30 Since unit tests are done with the SQLITE backend and this does not
       
    31 support multiple connections at a time, you must be careful when
       
    32 simulating security, changing users.
       
    33 
       
    34 By default, tests run with a user with admin privileges. This
       
    35 user/connection must never be closed.
       
    36 qwq
       
    37 Before a self.login, one has to release the connection pool in use with a self.commit, self.rollback or self.close.
       
    38 
       
    39 When one is logged in as a normal user and wants to switch back to the admin user, one has to use self.restore_connection().
       
    40 
       
    41 Usually it looks like this:
       
    42 
       
    43 .. sourcecode:: python
       
    44 
       
    45     # execute using default admin connection
       
    46     self.execute(...)
       
    47     # I want to login with another user, ensure to free admin connection pool
       
    48     # (could have used rollback but not close here, we should never close defaut admin connection)
       
    49     self.commit()
       
    50     cnx = self.login('user')
       
    51     # execute using user connection
       
    52     self.execute(...)
       
    53     # I want to login with another user or with admin user
       
    54     self.commit();  cnx.close()
       
    55     # restore admin connection, never use cnx = self.login('admin'), it will return
       
    56     # the default admin connection and one may be tempted to close it
       
    57     self.restore_connection()
       
    58 
       
    59 Do not use the references kept to the entities created with a connection from another.
       
    60 
       
    61 
       
    62 Email notifications tests
       
    63 -------------------------
       
    64 When running tests potentially generated e-mails are not really
       
    65 sent but is found in the list `MAILBOX` of module `cubicweb.devtools.apptest`.
       
    66 This list is reset at each test *setUp* (by the setUp of classes `EnvBasedTC`
       
    67 and `RepositoryBasedTC`).
       
    68 
       
    69 
       
    70 You can test your notifications by analyzing the contents of this list, which
       
    71 contains objects with two attributes:
       
    72 * `recipients`, the list of recipients
       
    73 * `msg`, object email.Message
       
    74 
       
    75 
       
    76 Automatic testing
       
    77 -----------------
       
    78 XXXFILLME