[2642] | 1 | Introduction |
---|
| 2 | ============ |
---|
| 3 | |
---|
| 4 | This is a full-blown functional test. The emphasis here is on testing what |
---|
| 5 | the user may input and see, and the system is largely tested as a black box. |
---|
| 6 | We use PloneTestCase to set up this test as well, so we have a full Plone site |
---|
| 7 | to play with. We *can* inspect the state of the portal, e.g. using |
---|
| 8 | self.portal and self.folder, but it is often frowned upon since you are not |
---|
| 9 | treating the system as a black box. Also, if you, for example, log in or set |
---|
| 10 | roles using calls like self.setRoles(), these are not reflected in the test |
---|
| 11 | browser, which runs as a separate session. |
---|
| 12 | |
---|
| 13 | Being a doctest, we can tell a story here. |
---|
| 14 | |
---|
| 15 | First, we must perform some setup. We use the testbrowser that is shipped |
---|
| 16 | with Five, as this provides proper Zope 2 integration. Most of the |
---|
| 17 | documentation, though, is in the underlying zope.testbrower package. |
---|
| 18 | |
---|
| 19 | >>> from Products.Five.testbrowser import Browser |
---|
| 20 | >>> browser = Browser() |
---|
| 21 | >>> portal_url = self.portal.absolute_url() |
---|
| 22 | |
---|
| 23 | The following is useful when writing and debugging testbrowser tests. It lets |
---|
| 24 | us see all error messages in the error_log. |
---|
| 25 | |
---|
| 26 | >>> self.portal.error_log._ignored_exceptions = () |
---|
| 27 | |
---|
| 28 | With that in place, we can go to the portal front page and log in. We will |
---|
| 29 | do this using the default user from PloneTestCase: |
---|
| 30 | |
---|
| 31 | >>> from Products.PloneTestCase.setup import portal_owner, default_password |
---|
| 32 | |
---|
| 33 | >>> browser.open(portal_url) |
---|
| 34 | |
---|
| 35 | We have the login portlet, so let's use that. |
---|
[2725] | 36 | |
---|
[2708] | 37 | >>> browser.getLink('Log in').click() |
---|
[2642] | 38 | >>> browser.getControl(name='__ac_name').value = portal_owner |
---|
| 39 | >>> browser.getControl(name='__ac_password').value = default_password |
---|
| 40 | >>> browser.getControl(name='submit').click() |
---|
| 41 | |
---|
| 42 | Here, we set the value of the fields on the login form and then simulate a |
---|
| 43 | submit click. |
---|
| 44 | |
---|
| 45 | We then test that we are still on the portal front page: |
---|
| 46 | |
---|
| 47 | >>> browser.url == portal_url |
---|
| 48 | True |
---|
| 49 | |
---|
| 50 | And we ensure that we get the friendly logged-in message: |
---|
| 51 | |
---|
| 52 | >>> "You are now logged in" in browser.contents |
---|
| 53 | True |
---|
| 54 | |
---|
| 55 | |
---|
| 56 | -*- extra stuff goes here -*- |
---|
[2646] | 57 | The GSpreadsheet content type |
---|
| 58 | =============================== |
---|
[2642] | 59 | |
---|
[2646] | 60 | In this section we are tesing the GSpreadsheet content type by performing |
---|
| 61 | basic operations like adding, updadating and deleting GSpreadsheet content |
---|
| 62 | items. |
---|
| 63 | |
---|
| 64 | Adding a new GSpreadsheet content item |
---|
| 65 | -------------------------------- |
---|
| 66 | |
---|
| 67 | We use the 'Add new' menu to add a new content item. |
---|
| 68 | |
---|
| 69 | >>> browser.getLink('Add new').click() |
---|
| 70 | |
---|
| 71 | Then we select the type of item we want to add. In this case we select |
---|
| 72 | 'GSpreadsheet' and click the 'Add' button to get to the add form. |
---|
| 73 | |
---|
| 74 | >>> browser.getControl('GSpreadsheet').click() |
---|
| 75 | >>> browser.getControl(name='form.button.Add').click() |
---|
| 76 | >>> 'GSpreadsheet' in browser.contents |
---|
| 77 | True |
---|
| 78 | |
---|
| 79 | Now we fill the form and submit it. |
---|
| 80 | |
---|
| 81 | >>> browser.getControl(name='title').value = 'GSpreadsheet Sample' |
---|
[2725] | 82 | >>> browser.getControl(name='spreadsheet_id').value = 'sp_id1' |
---|
| 83 | >>> browser.getControl(name='worksheet_id').value = 'od6' |
---|
[2727] | 84 | >>> browser.getControl(name='order_columns.column_key:records',index=0).value |
---|
| 85 | [] |
---|
| 86 | >>> browser.getControl(name='order_columns.column_title:records', index=0).value |
---|
| 87 | '' |
---|
[2646] | 88 | >>> browser.getControl('Save').click() |
---|
| 89 | >>> 'Changes saved' in browser.contents |
---|
| 90 | True |
---|
| 91 | |
---|
| 92 | And we are done! We added a new 'GSpreadsheet' content item to the portal. |
---|
| 93 | |
---|
| 94 | Updating an existing GSpreadsheet content item |
---|
| 95 | --------------------------------------- |
---|
| 96 | |
---|
| 97 | Let's click on the 'edit' tab and update the object attribute values. |
---|
| 98 | |
---|
| 99 | >>> browser.getLink('Edit').click() |
---|
| 100 | >>> browser.getControl(name='title').value = 'New GSpreadsheet Sample' |
---|
[2708] | 101 | >>> browser.getControl(name='spreadsheet_id').value = 'id1' |
---|
| 102 | >>> browser.getControl(name='worksheet_id').value = 'od6' |
---|
[2727] | 103 | >>> browser.getControl(name='order_columns.orderindex_:records',index=0).value = '1' |
---|
| 104 | >>> browser.getControl(name='order_columns.column_key:records',index=0).value = ['col1'] |
---|
| 105 | >>> browser.getControl(name='order_columns.column_title:records', index=0).value = 'Title 1' |
---|
[2646] | 106 | >>> browser.getControl('Save').click() |
---|
[2727] | 107 | >>> browser.getLink('Edit').click() |
---|
| 108 | >>> browser.getControl(name='order_columns.orderindex_:records',index=1).value = '2' |
---|
| 109 | >>> browser.getControl(name='order_columns.column_key:records',index=1).value = ['col2'] |
---|
| 110 | >>> browser.getControl(name='order_columns.column_title:records', index=1).value = 'Title 2' |
---|
| 111 | >>> browser.getControl('Save').click() |
---|
| 112 | |
---|
[2646] | 113 | We check that the changes were applied. |
---|
| 114 | |
---|
| 115 | >>> 'Changes saved' in browser.contents |
---|
| 116 | True |
---|
| 117 | >>> 'New GSpreadsheet Sample' in browser.contents |
---|
| 118 | True |
---|
[2727] | 119 | >>> browser.contents |
---|
| 120 | '...<table id="sshwsh"><tr><th>Title 1</th><th>Title 2</th></tr><tr><td>11</td><td>12</td></tr>\n<tr><td>21</td><td>22</td></tr>\n<tr><td>31</td><td>32</td></tr>\n<tr><td>41</td><td>42</td></tr>\n<tr><td>51</td><td>52</td></tr>\n</table>...' |
---|
[2646] | 121 | |
---|
[2727] | 122 | Let's click on the 'edit' tab and update the object attribute values. |
---|
| 123 | |
---|
| 124 | >>> browser.getLink('Edit').click() |
---|
| 125 | >>> browser.getControl(name='order_columns.orderindex_:records',index=1).value = '2' |
---|
| 126 | >>> browser.getControl(name='order_columns.column_key:records',index=1).value = ['col3'] |
---|
| 127 | >>> browser.getControl(name='order_columns.column_title:records', index=1).value = 'Title 3' |
---|
| 128 | >>> browser.getControl('Save').click() |
---|
| 129 | |
---|
| 130 | We check that the changes were applied. |
---|
| 131 | |
---|
| 132 | >>> 'Changes saved' in browser.contents |
---|
| 133 | True |
---|
| 134 | >>> browser.contents |
---|
| 135 | '...<table id="sshwsh"><tr><th>Title 1</th><th>Title 3</th></tr><tr><td>11</td><td>13</td></tr>\n<tr><td>21</td><td>23</td></tr>\n<tr><td>31</td><td>33</td></tr>\n<tr><td>41</td><td>43</td></tr>\n<tr><td>51</td><td>53</td></tr>\n</table>...' |
---|
| 136 | |
---|
[2646] | 137 | Removing a/an GSpreadsheet content item |
---|
| 138 | -------------------------------- |
---|
| 139 | |
---|
| 140 | If we go to the home page, we can see a tab with the 'New GSpreadsheet |
---|
| 141 | Sample' title in the global navigation tabs. |
---|
| 142 | |
---|
| 143 | >>> browser.open(portal_url) |
---|
| 144 | >>> 'New GSpreadsheet Sample' in browser.contents |
---|
| 145 | True |
---|
| 146 | |
---|
| 147 | Now we are going to delete the 'New GSpreadsheet Sample' object. First we |
---|
| 148 | go to the contents tab and select the 'New GSpreadsheet Sample' for |
---|
| 149 | deletion. |
---|
| 150 | |
---|
| 151 | >>> browser.getLink('Contents').click() |
---|
| 152 | >>> browser.getControl('New GSpreadsheet Sample').click() |
---|
| 153 | |
---|
| 154 | We click on the 'Delete' button. |
---|
| 155 | |
---|
| 156 | >>> browser.getControl('Delete').click() |
---|
| 157 | >>> 'Item(s) deleted' in browser.contents |
---|
| 158 | True |
---|
| 159 | |
---|
| 160 | So, if we go back to the home page, there is no longer a 'New GSpreadsheet |
---|
| 161 | Sample' tab. |
---|
| 162 | |
---|
| 163 | >>> browser.open(portal_url) |
---|
| 164 | >>> 'New GSpreadsheet Sample' in browser.contents |
---|
| 165 | False |
---|
| 166 | |
---|
| 167 | Adding a new GSpreadsheet content item as contributor |
---|
| 168 | ------------------------------------------------ |
---|
| 169 | |
---|
| 170 | Not only site managers are allowed to add GSpreadsheet content items, but |
---|
| 171 | also site contributors. |
---|
| 172 | |
---|
| 173 | Let's logout and then login as 'contributor', a portal member that has the |
---|
| 174 | contributor role assigned. |
---|
| 175 | |
---|
| 176 | >>> browser.getLink('Log out').click() |
---|
| 177 | >>> browser.open(portal_url) |
---|
[2725] | 178 | >>> browser.getLink('Log in').click() |
---|
[2646] | 179 | >>> browser.getControl(name='__ac_name').value = 'contributor' |
---|
| 180 | >>> browser.getControl(name='__ac_password').value = default_password |
---|
| 181 | >>> browser.getControl(name='submit').click() |
---|
| 182 | >>> browser.open(portal_url) |
---|
| 183 | |
---|
| 184 | We use the 'Add new' menu to add a new content item. |
---|
| 185 | |
---|
| 186 | >>> browser.getLink('Add new').click() |
---|
| 187 | |
---|
| 188 | We select 'GSpreadsheet' and click the 'Add' button to get to the add form. |
---|
| 189 | |
---|
| 190 | >>> browser.getControl('GSpreadsheet').click() |
---|
| 191 | >>> browser.getControl(name='form.button.Add').click() |
---|
| 192 | >>> 'GSpreadsheet' in browser.contents |
---|
| 193 | True |
---|
| 194 | |
---|
| 195 | Now we fill the form and submit it. |
---|
| 196 | |
---|
| 197 | >>> browser.getControl(name='title').value = 'GSpreadsheet Sample' |
---|
[2725] | 198 | >>> browser.getControl(name='spreadsheet_id').value = 'sp_id1' |
---|
| 199 | >>> browser.getControl(name='worksheet_id').value = 'od6' |
---|
[2646] | 200 | >>> browser.getControl('Save').click() |
---|
| 201 | >>> 'Changes saved' in browser.contents |
---|
| 202 | True |
---|
| 203 | |
---|
| 204 | Done! We added a new GSpreadsheet content item logged in as contributor. |
---|
| 205 | |
---|
| 206 | Finally, let's login back as manager. |
---|
| 207 | |
---|
| 208 | >>> browser.getLink('Log out').click() |
---|
| 209 | >>> browser.open(portal_url) |
---|
[2725] | 210 | >>> browser.getLink('Log in').click() |
---|
[2646] | 211 | >>> browser.getControl(name='__ac_name').value = portal_owner |
---|
| 212 | >>> browser.getControl(name='__ac_password').value = default_password |
---|
| 213 | >>> browser.getControl(name='submit').click() |
---|
| 214 | >>> browser.open(portal_url) |
---|