|
| 1 | +# Utility Guide: User Tools |
| 2 | + |
| 3 | +The User Tools utility provided by this blueprint allows for the easy management of test users via a json file included |
| 4 | +at the base of the repository. |
| 5 | + |
| 6 | +## Table of Contents |
| 7 | + |
| 8 | +- [Utility Guide: User Tools](#utility-guide-user-tools) |
| 9 | + - [Table of Contents](#table-of-contents) |
| 10 | + - [Using the User Tools class](#using-the-user-tools-class) |
| 11 | + - [Managing Users](#managing-users) |
| 12 | + - [Considering Security](#considering-security) |
| 13 | + - [`retrieve_user()`: Retrieve User Details](#retrieve_user-retrieve-user-details) |
| 14 | + - [Required Arguments](#required-arguments) |
| 15 | + - [Returns](#returns) |
| 16 | + - [Example Usage](#example-usage) |
| 17 | + |
| 18 | +## Using the User Tools class |
| 19 | + |
| 20 | +You can initialise the User Tools class by using the following code in your test file: |
| 21 | + |
| 22 | + from utils.user_tools import UserTools |
| 23 | + |
| 24 | +This module has been designed as a static class, so you do not need to instantiate it when you want to retrieve any user information. |
| 25 | + |
| 26 | +## Managing Users |
| 27 | + |
| 28 | +For this class, users are managed via the [users.json](../../users.json) file provided with this repository. For any new users you need to |
| 29 | +add, the idea is to just add a new record, with any appropriate metadata you need for the user whilst they interact with your application. |
| 30 | + |
| 31 | +For example, adding a record like so (this example shows the entire `users.json` file): |
| 32 | + |
| 33 | + { |
| 34 | + "Documentation User": { |
| 35 | + "username": "DOC_USER", |
| 36 | + "roles": ["Example Role A"], |
| 37 | + "unique_id": 42 |
| 38 | + } |
| 39 | + } |
| 40 | + |
| 41 | +The data you require for these users can be completely customised for what information you need, so whilst the example shows `username`, `roles` |
| 42 | +and `unique_id` as possible values we may want to use, this is not an exhaustive list. The key that is used (so in this example, `"Documentation User"`) |
| 43 | +is also customisable and should be how you want to easily reference retrieving this user in your tests. |
| 44 | + |
| 45 | +### Considering Security |
| 46 | + |
| 47 | +An important note on managing users in this way is that passwords or security credentials should **never** be stored in the `users.json` file. These |
| 48 | +are considered secrets, and whilst it may be convenient to store them in this file, it goes against the |
| 49 | +[security principles outlined in the Software Engineering Quality Framework](https://github.com/NHSDigital/software-engineering-quality-framework/blob/main/practices/security.md#application-level-security). |
| 50 | + |
| 51 | +With this in mind, it's recommended to do the following when it comes to managing these types of credentials: |
| 52 | + |
| 53 | +- When running locally, store any secret values in a local configuration file and set this file in `.gitignore` so it is not committed to the codebase. |
| 54 | +- When running via a CI/CD process, store any secret values in an appropriate secret store and pass the values into pytest at runtime. |
| 55 | + |
| 56 | +## `retrieve_user()`: Retrieve User Details |
| 57 | + |
| 58 | +The `retrieve_user()` method is designed to easily retrieve the data for a specific user entry from the `users.json` file. This is a static method, |
| 59 | +so can be called using the following logic: |
| 60 | + |
| 61 | + # Retrieving documentation user details from example |
| 62 | + user_details = UserTools.retrieve_user("Documentation User") |
| 63 | + |
| 64 | +### Required Arguments |
| 65 | + |
| 66 | +The following are required for `UserTools.retrieve_user()`: |
| 67 | + |
| 68 | +| Argument | Format | Description | |
| 69 | +| -------- | ------ | ------------------------------------------------------- | |
| 70 | +| user | `str` | The key from `users.json` for the user details required | |
| 71 | + |
| 72 | +### Returns |
| 73 | + |
| 74 | +A Python `dict` object that contains the values associated with the provided user argument. |
| 75 | + |
| 76 | +### Example Usage |
| 77 | + |
| 78 | +When using a `users.json` file as set up in the example above: |
| 79 | + |
| 80 | + from utils.user_tools import UserTools |
| 81 | + from playwright.sync_api import Page |
| 82 | + |
| 83 | + def test_login(page: Page) -> None: |
| 84 | + # Retrieving documentation user details from example |
| 85 | + user_details = UserTools.retrieve_user("Documentation User") |
| 86 | + |
| 87 | + # Use values to populate a form |
| 88 | + page.get_by_role("textbox", name="Username").fill(user_details["username"]) |
| 89 | + page.get_by_role("textbox", name="ID").fill(user_details["unique_id"]) |
0 commit comments