MIL-001 Project setup #21
+77
@@ -0,0 +1,77 @@
|
||||
# Secrets and local environment
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
.venv/
|
||||
venv/
|
||||
env/
|
||||
|
||||
# AI prompt log (the repository is public, see framework/process/ai-prompt-log.md)
|
||||
/docs/ai-prompts/
|
||||
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
build/
|
||||
dist/
|
||||
develop-eggs/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage / tool caches
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
.ruff_cache/
|
||||
.mypy_cache/
|
||||
.pytype/
|
||||
.pyre/
|
||||
|
||||
# Jupyter, IPython
|
||||
.ipynb_checkpoints
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# Doxygen output
|
||||
/docs/doxygen/
|
||||
|
||||
# Browser run results (screenshots are copied to docs/images/ on purpose)
|
||||
/results/
|
||||
|
||||
# IDEs and OS
|
||||
.idea/
|
||||
.vscode/
|
||||
*.swp
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
@@ -0,0 +1,3 @@
|
||||
[submodule "framework"]
|
||||
path = framework
|
||||
url = ssh://git@git.tirsystem.com:10022/TirSystem/SQA-QC-Framework.git
|
||||
@@ -0,0 +1,40 @@
|
||||
# Doxygen configuration for fill-out-form (Python sources in src/).
|
||||
# Generate the HTML documentation with: doxygen Doxyfile
|
||||
# Output goes to docs/doxygen/ (ignored by git).
|
||||
|
||||
PROJECT_NAME = "fill-out-form"
|
||||
PROJECT_BRIEF = "Udemy 100 Days of Code, Day 48: fill out a form with Selenium"
|
||||
PROJECT_NUMBER = 0.1.0
|
||||
OUTPUT_DIRECTORY = docs/doxygen
|
||||
CREATE_SUBDIRS = NO
|
||||
OUTPUT_LANGUAGE = English
|
||||
|
||||
# Python sources
|
||||
INPUT = src README.md
|
||||
FILE_PATTERNS = *.py *.md
|
||||
RECURSIVE = YES
|
||||
EXCLUDE_PATTERNS = */__pycache__/*
|
||||
OPTIMIZE_OUTPUT_JAVA = YES
|
||||
EXTRACT_ALL = YES
|
||||
EXTRACT_PRIVATE = NO
|
||||
EXTRACT_STATIC = YES
|
||||
AUTOLINK_SUPPORT = YES
|
||||
MARKDOWN_SUPPORT = YES
|
||||
USE_MDFILE_AS_MAINPAGE = README.md
|
||||
PYTHON_DOCSTRING = YES
|
||||
|
||||
# Output formats
|
||||
GENERATE_HTML = YES
|
||||
HTML_OUTPUT = html
|
||||
GENERATE_LATEX = NO
|
||||
GENERATE_XML = NO
|
||||
|
||||
# Diagrams are not needed and Graphviz is not required
|
||||
HAVE_DOT = NO
|
||||
CLASS_DIAGRAMS = NO
|
||||
|
||||
# Messages
|
||||
QUIET = YES
|
||||
WARNINGS = YES
|
||||
WARN_IF_UNDOCUMENTED = YES
|
||||
WARN_IF_DOC_ERROR = YES
|
||||
@@ -1,2 +1,144 @@
|
||||
# 048-fill-out-form
|
||||
# 🚀 048-fill-out-form
|
||||
|
||||
Udemy "100 Days of Code: The Complete Python Pro Bootcamp", Day 48: automate a browser with Selenium — click a link by its text, type into a search box, send the Enter key and fill out a sign-up form. For course participants who want to compare solutions and for anyone who wants a small, tested Selenium example.
|
||||
|
||||
## 📚 Table of Contents
|
||||
|
||||
- [Overview](#-overview)
|
||||
- [Requirements](#-requirements)
|
||||
- [Setup](#-setup)
|
||||
- [Run](#-run)
|
||||
- [Tests](#-tests)
|
||||
- [License](#-license)
|
||||
- [Links](#-links)
|
||||
- [Appendix: Project documents](#-appendix-project-documents)
|
||||
|
||||
## 🧭 Overview
|
||||
|
||||
The code automates the three steps of the lecture:
|
||||
|
||||
1. `click_link_by_text` — click the "Content portals" link on the Wikipedia main page.
|
||||
2. `search_for` — type "Python" into the search box and press Enter.
|
||||
3. `fill_out_form` — type a first name, last name and email into the sign-up form and click the button.
|
||||
|
||||
| Part | What it is for |
|
||||
| --- | --- |
|
||||
| `src/fill_out_form/` | The package: `constants.py` holds every URL, locator and text; the layers `domain`, `application`, `infrastructure` and `presentation` hold the code |
|
||||
| `tests/` | pytest tests (`unit/`), the browser run (`e2e/`) and a local copy of the form (`fixtures/`) |
|
||||
| `docs/` | Project documents, screenshots and the wiki in English, Danish and Bahasa Malaysia |
|
||||
| `Doxyfile` | Configuration for the Doxygen API documentation |
|
||||
|
||||
## 📋 Requirements
|
||||
|
||||
- Python 3.13 or newer, with `venv` — the language and the isolated environment.
|
||||
- Google Chrome or Chromium — the browser that Selenium drives (Selenium 4 finds the driver itself).
|
||||
- Docker — only to run the browser in a container and take the screenshots.
|
||||
- Doxygen — only to build the API documentation (optional).
|
||||
|
||||
The only runtime dependency is `selenium`; `pytest`, `ruff` and `mypy` are development extras.
|
||||
|
||||
## 🛠️ Setup
|
||||
|
||||
Create and use a local virtual environment in `.venv`:
|
||||
|
||||
```bash
|
||||
python -m venv .venv
|
||||
```
|
||||
|
||||
Activate it (Linux, macOS, Git Bash):
|
||||
|
||||
```bash
|
||||
source .venv/bin/activate
|
||||
```
|
||||
|
||||
Activate it (Windows PowerShell):
|
||||
|
||||
```powershell
|
||||
.venv\Scripts\Activate.ps1
|
||||
```
|
||||
|
||||
Upgrade pip and install the project with the development extras:
|
||||
|
||||
```bash
|
||||
python -m pip install --upgrade pip
|
||||
```
|
||||
|
||||
```bash
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
## ▶️ Run
|
||||
|
||||
Run the three lecture steps in a visible Chrome window:
|
||||
|
||||
```bash
|
||||
python -m fill_out_form
|
||||
```
|
||||
|
||||
Useful options: `--headless` (no window), `--screenshots DIR` (save one picture per step) and `--form-url URL` (use another form page). See `python -m fill_out_form --help`.
|
||||
|
||||
Run the steps in Docker (headless, screenshots in `results/`), which never touches your desktop:
|
||||
|
||||
```bash
|
||||
docker build -t fill-out-form -f docker/Dockerfile .
|
||||
```
|
||||
|
||||
```bash
|
||||
docker run --rm -v "$(pwd)/results:/results" fill-out-form
|
||||
```
|
||||
|
||||
## 🧪 Tests
|
||||
|
||||
The unit tests need no browser and no network:
|
||||
|
||||
```bash
|
||||
python -m pytest
|
||||
```
|
||||
|
||||
Build the API documentation with Doxygen (output in `docs/doxygen/`):
|
||||
|
||||
```bash
|
||||
doxygen Doxyfile
|
||||
```
|
||||
|
||||
## 📄 License
|
||||
|
||||
GNU Affero General Public License v3.0, see [LICENSE][license].
|
||||
|
||||
## 🔗 Links
|
||||
|
||||
- [Repository][repository]
|
||||
- [Documentation][documentation]
|
||||
- [Issue tracker][issues]
|
||||
|
||||
## 📎 Appendix: Project documents
|
||||
|
||||
The documents a newcomer needs, in reading order.
|
||||
|
||||
| Document | What it tells you |
|
||||
| --- | --- |
|
||||
| [AGENTS.md][agents] | The rules AI agents follow in this repository |
|
||||
| [Business Case][BC-001] | Why the project exists, its scope and success criteria |
|
||||
| [Stakeholder Analysis][SA-001] | Who is involved; the stakeholder IDs used for owners and reviewers |
|
||||
| [Project Plan][PP-001] | The gateways and their schedule |
|
||||
| [Milestones][milestones] | One document per gateway: Go/No-Go criteria and tasks |
|
||||
| [Artifact registry][registry] | Where each artifact type lives, the next version, the PO language and domain |
|
||||
| [Traceability matrix][TM-001] | How the artifacts link and when each was last reviewed |
|
||||
| [Framework README][framework-readme] | The framework this project uses |
|
||||
| [Framework changelog][framework-changelog] | What changed in each framework release |
|
||||
|
||||
---
|
||||
|
||||
[repository]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form
|
||||
[documentation]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/wiki
|
||||
[issues]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/issues
|
||||
[license]: ./LICENSE
|
||||
[agents]: ./AGENTS.md
|
||||
[BC-001]: ./docs/business-case.md
|
||||
[SA-001]: ./docs/stakeholder-analysis.md
|
||||
[PP-001]: ./docs/project-plan.md
|
||||
[milestones]: ./docs/milestones/
|
||||
[registry]: ./docs/artifact-registry.md
|
||||
[TM-001]: ./docs/sqa/traceability-matrix.md
|
||||
[framework-readme]: ./framework/README.md
|
||||
[framework-changelog]: ./framework/CHANGELOG.md
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
# ADR-0001 Dependencies, form page and browser environment
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | ADR-0001 |
|
||||
| CrossReference | [BC-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
Allowed Status values: `Proposed`, `Accepted`, `Rejected`, `Deprecated`, `Superseded by ADR-NNNN`.
|
||||
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
The project drives a browser with Selenium (the lecture's subject). S03 wants no runtime dependencies beyond the necessary (CN-006). The lecture's form challenge uses a public demo page that is online today but is not under our control. The framework forbids testing a GUI on the host desktop (`framework/process/gui-testing.md`). Options considered: (a) add helper libraries such as `python-dotenv` or `webdriver-manager`; (b) run only against the live demo page; (c) a local HTML fixture for unit tests plus a Docker browser run for screenshots.
|
||||
|
||||
## Decision
|
||||
|
||||
Selenium is the only runtime dependency (pytest, ruff and mypy are `dev` extras). Unit tests use a fake browser and a local HTML fixture, never the network; the live pages are used only by the Docker browser run that produces the screenshots. Any browser run happens in a Docker container, never on the host desktop. The `.env` file is never read by the project.
|
||||
|
||||
## Consequences
|
||||
|
||||
**Positive:**
|
||||
|
||||
- The installation is one dependency; Selenium Manager finds the driver, so no driver helper is needed.
|
||||
- Unit tests are fast, offline and independent of a third-party site.
|
||||
- The user's desktop is never taken over by a browser.
|
||||
|
||||
**Negative:**
|
||||
|
||||
- Screenshots need Docker.
|
||||
- The fixture can drift from the live demo page; the Docker run is the check.
|
||||
|
||||
## Affected Artifacts
|
||||
|
||||
- [BC-001] — realises success criterion 4 (one runtime dependency) and the risk about the demo page
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../business-case.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,61 @@
|
||||
# Artifact Registry
|
||||
|
||||
This project's artifact state. Types, short names and `CrossReference
|
||||
Candidates` come from the framework catalog
|
||||
(`framework/registry/artifact-catalog.md`); this file only records where
|
||||
each document lives in *this* project and the next version to use.
|
||||
|
||||
Delete rows for types you don't use. Add a row the first time you create a
|
||||
document of a type. `Primary File` may contain a glob (e.g.
|
||||
`docs/use-cases/uc-*/uc.md`); `framework/scripts/find-crossreferences.sh` reads it.
|
||||
|
||||
| Short Name | Artifact Type | Primary File | Next Available Version |
|
||||
| --- | --- | --- | --- |
|
||||
| BC | Business Case | docs/business-case.md | 002 |
|
||||
| SA | Stakeholder Analysis | docs/stakeholder-analysis.md | 002 |
|
||||
| PP | Project Plan | docs/project-plan.md | 002 |
|
||||
| MIL | Milestone / Gateway | docs/milestones/*.md | 004 |
|
||||
| ADR | Architecture Decision Record | docs/adr/adr-NNNN-*.md | 0002 |
|
||||
| RC | SQA Review Record | docs/sqa/reviews/rc-*.md | 009 |
|
||||
| TM | Traceability Matrix | docs/sqa/traceability-matrix.md | 002 |
|
||||
|
||||
## Languages
|
||||
|
||||
Set the PO language when the project starts; `project-planning` asks for it
|
||||
if it is missing. An artifact of a type marked "Written in the PO language"
|
||||
exists once, in that language, under its normal name (`business-case.md`); the
|
||||
`artifact` skill ("One file per artifact") has the rule.
|
||||
|
||||
| Setting | Value |
|
||||
| --- | --- |
|
||||
| PO language | en |
|
||||
| PO domain | it |
|
||||
| High-level register | IT Executive English |
|
||||
| Technical register | IT Professional English |
|
||||
| Wiki languages | en and the PO language, at least (`framework/process/wiki.md`) |
|
||||
|
||||
Every artifact of a type marked "Yes" below states its language and domain in
|
||||
its `Language` and `Domain` Metadata rows; `new-artifact.sh` fills them from
|
||||
`PO language` and `PO domain`. `Language` is a BCP 47 code (`da`, `en`).
|
||||
`Domain` is a value from this list; add a row to introduce a domain, so a
|
||||
reviewer can see at once which professional vocabulary a document uses.
|
||||
|
||||
| Domain | Meaning |
|
||||
| --- | --- |
|
||||
| it | Software and IT |
|
||||
| medical | Healthcare and medical devices |
|
||||
| construction | Construction and civil engineering |
|
||||
|
||||
| Artifact types | Register | Written in the PO language |
|
||||
| --- | --- | --- |
|
||||
| BC, KPI, PP, MIL | IT Executive English | Yes |
|
||||
| SA, BMC, BPMN, UCD, US, UC, SSD, DM, RA, GOV, DICT | IT Professional English | Yes |
|
||||
| OC, SD, DCD, ERD, TP, AD, ADR, TM, RC, QC, source code | IT Professional English | No |
|
||||
|
||||
## Notes
|
||||
|
||||
- "Next Available Version" is the zero-padded (3-digit) version to use the
|
||||
*next* time a new document of that type is created. Increment it only when
|
||||
a brand-new document is created, not when an existing document's
|
||||
`## Version History` gets a row.
|
||||
- `ADR` uses 4 digits (`0001`); `RC` is sequential across all artifact types.
|
||||
@@ -0,0 +1,143 @@
|
||||
# Business Case
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | BC-001 |
|
||||
| CrossReference | [SA-001] |
|
||||
| Language | en |
|
||||
| Domain | it |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
Day 48 of the Udemy course "100 Days of Code: The Complete Python Pro Bootcamp" teaches Selenium WebDriver: clicking links, typing into inputs, sending special keys and filling out a sign-up form. This project turns that assignment into a small, readable, runnable Python repository with tests, documentation, a screenshot for every lecture step and a three-language wiki. It is a learning and portfolio project with one person doing the work.
|
||||
|
||||
## Methodological and Standards Foundation
|
||||
|
||||
- The SQA and QC framework mounted at `framework/` governs documents, reviews and the plan-first gate.
|
||||
- Quality characteristics follow ISO/IEC 25010:2023.
|
||||
- Code follows the `coding-conventions` skill (Python) and the layering of the `clean-architecture` skill.
|
||||
- Docs-as-code: every change reaches `main` by a pull request, one pull request per milestone.
|
||||
|
||||
## Problem Statement
|
||||
|
||||
- The course assignment is normally solved as one throw-away script. The author's earlier solution (the day-48 folder of a monolithic course repository) is a scratch file that does not follow the lecture, has no tests and no documentation.
|
||||
- Other course participants cannot easily compare solutions or see what each lecture step produces.
|
||||
- A repository without a description, topics and a README is neither found nor understood by GitHub viewers.
|
||||
|
||||
## Business Opportunity
|
||||
|
||||
A clean reference solution for the lecture lets the author keep a tidy portfolio, lets course participants compare solutions, and shows a repeatable project structure (src, tests, docs, wiki) for the remaining days of the course.
|
||||
|
||||
## Objectives
|
||||
|
||||
1. Deliver Python code that automates the lecture steps with Selenium: click a link by its text, search for "Python" and press Enter, and fill out a form (first name, last name, email) and click the sign-up button.
|
||||
2. Deliver pytest tests for all logic that needs no browser.
|
||||
3. Deliver a screenshot for each lecture step, shown in the README and the wiki.
|
||||
4. Deliver a wiki in English, Danish and Bahasa Malaysia that explains what was gained in each lecture step.
|
||||
5. Configure the repository: description, topics, Python `.gitignore`, `pyproject.toml`, Doxyfile, and instructions for a local `.venv`.
|
||||
|
||||
## Scope
|
||||
|
||||
### In Scope
|
||||
|
||||
- Python 3.13 or newer package under `src/`, tests under `tests/`, documents under `docs/`.
|
||||
- Constants in `constants.py`; Doxygen comments in the source and a `Doxyfile`.
|
||||
- `pyproject.toml`, venv instructions (`python -m pip install --upgrade pip`), Python `.gitignore`.
|
||||
- README from the framework template, with run and test instructions and screenshots.
|
||||
- Wiki pages in English, Danish and Bahasa Malaysia (`docs/wiki/`), with the same screenshots.
|
||||
- Repository description and topics on the git host.
|
||||
|
||||
### Out of Scope
|
||||
|
||||
- Running the browser automation on the host desktop (it runs in Docker, see `framework/process/gui-testing.md`).
|
||||
- Later days of the course and the final project.
|
||||
- Packaging for PyPI, a graphical front end, and a web service.
|
||||
- Reading, testing or importing the personal tokens in `.env`.
|
||||
|
||||
## Expected Benefits
|
||||
|
||||
### Tangible Benefits
|
||||
|
||||
- A runnable reference solution with passing tests.
|
||||
- One screenshot per lecture step (at least three).
|
||||
- Three language versions of the wiki.
|
||||
|
||||
### Intangible Benefits
|
||||
|
||||
- A reusable project layout for the other course days.
|
||||
- Practice with Selenium, pytest and docs-as-code.
|
||||
- A repository others can read and learn from.
|
||||
|
||||
## Strategic Alignment
|
||||
|
||||
The project supports the author's goal of completing the course with a documented, reviewable portfolio, and the framework's goal of showing the plan-first workflow on a small project.
|
||||
|
||||
## Success Criteria
|
||||
|
||||
| # | Criterion | Target | Measure |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | Tests pass | 100 % of pytest tests pass on Python 3.13 | `pytest` exit code 0 |
|
||||
| 2 | Lecture steps covered | 3 of 3 steps (link click, search, form) implemented and shown by a screenshot | Files in `docs/images/` |
|
||||
| 3 | Wiki languages | 3 of 3 languages with the same page set | Files in `docs/wiki/` |
|
||||
| 4 | Runtime dependencies | Exactly 1 (selenium) | `dependencies` in `pyproject.toml` |
|
||||
| 5 | Repository metadata | Description set and at least 5 topics | Git host API response |
|
||||
| 6 | Quality gate | Every document and the code have an `RC-*` with verdict Go | `docs/sqa/reviews/` |
|
||||
|
||||
## Risks
|
||||
|
||||
| Risk | Impact | Mitigation |
|
||||
| --- | --- | --- |
|
||||
| The assignment's form page (a Heroku demo) is offline | The form step cannot be shown against the original site | A local HTML fixture with the same field names serves tests and screenshots; the original URL is a constant |
|
||||
| Docker or the browser image is unavailable | No screenshots | Stop and report (gui-testing rule 5); never fall back to the host desktop |
|
||||
| Wikipedia changes its page layout | Selectors break | Selectors live in `constants.py`; screenshots record the state on the capture date |
|
||||
| Danish or Bahasa Malaysia text contains errors | Misleading text | English is authoritative; translations follow page by page; the author can correct them |
|
||||
| Tokens in `.env` leak | Account compromise | `.env` is in `.gitignore` and is never read by project code or tests |
|
||||
|
||||
## Assumptions
|
||||
|
||||
- S01 is Product Owner, developer and reviewer; in autonomous mode the AI stands in for the reviewer, recorded as not independent.
|
||||
- Docker is installed on the author's machine.
|
||||
- The git host accepts the token in `.env` for repository and issue operations.
|
||||
- "Python greater than 3.13" is read as 3.13 or newer (`requires-python = ">=3.13"`).
|
||||
|
||||
## Constraints
|
||||
|
||||
- Duration: one week, 2026-10-28 to 2026-11-04.
|
||||
- Python 3.13 or newer, `venv`, `pytest`, `pyproject.toml`.
|
||||
- Folder structure `src/`, `tests/`, `docs/`.
|
||||
- Only runtime dependency: selenium.
|
||||
- Product Owner domain: IT; language: English.
|
||||
|
||||
## Cost–Benefit Assessment
|
||||
|
||||
Qualitative, because the project is unpaid learning work with no revenue.
|
||||
|
||||
| Costs | Benefits |
|
||||
| --- | --- |
|
||||
| About one week of the author's time and AI usage | A reference solution, documentation in three languages and a reusable project layout |
|
||||
| A Docker image download | Safe, reproducible browser runs |
|
||||
|
||||
## Stakeholders
|
||||
|
||||
| Stakeholder ID (SA) | Interest in this project |
|
||||
| --- | --- |
|
||||
| S01 | Wants a tidy portfolio piece (CN-001, CN-002, CN-007) |
|
||||
| S02 | Wants readable, runnable code with the assignment's function names and run instructions (CN-003, CN-004) |
|
||||
| S03 | Wants a clear repository description, topics and README, and no unnecessary runtime dependencies (CN-005, CN-006) |
|
||||
|
||||
## Recommendation
|
||||
|
||||
Proceed — the scope is small, the risks are mitigated and the outcome is a reusable reference.
|
||||
|
||||
---
|
||||
|
||||
[SA-001]: ./stakeholder-analysis.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,76 @@
|
||||
# MIL-001 Project setup
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | MIL-001 |
|
||||
| CrossReference | [BC-001] |
|
||||
| Language | en |
|
||||
| Domain | it |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
Decide whether the repository is configured well enough to start writing the Selenium code: project configuration, folder structure, constants, tooling, documentation skeleton and repository metadata.
|
||||
|
||||
## Deliverable
|
||||
|
||||
A repository on branch `mil-001-project-setup` with `pyproject.toml`, the `src/` and `tests/` skeleton, `constants.py`, a Python `.gitignore`, a `Doxyfile`, the README with venv instructions, ADR-0001, and the repository description and topics set on the git host.
|
||||
|
||||
## Go / No-Go Criteria
|
||||
|
||||
| # | Criterion (objectively checkable) | Go | No-Go |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | `python -m venv .venv`, `python -m pip install --upgrade pip` and `pip install -e ".[dev]"` succeed on Python 3.13 | All three succeed | Any fails |
|
||||
| 2 | `pytest` runs and exits 0 on the skeleton | Exit 0 | Non-zero |
|
||||
| 3 | `[project] dependencies` lists only selenium | Only selenium | Any other runtime dependency |
|
||||
| 4 | The git host shows a description and at least 5 topics | Both present | Either missing |
|
||||
| 5 | `.env` is ignored and is not read by any file under `src/` or `tests/` | `git check-ignore .env` succeeds; no match for `.env` in code | Otherwise |
|
||||
| 6 | The code review record against `QC-PY-001` is `Go` | Go | No-Go |
|
||||
|
||||
## Dependencies
|
||||
|
||||
| Depends on | Reason |
|
||||
| --- | --- |
|
||||
| None | First gateway; the Business Case, Stakeholder Analysis and Project Plan are accepted before it starts |
|
||||
|
||||
## Traceability
|
||||
|
||||
| Business Case objective / KPI / user story | Reference |
|
||||
| --- | --- |
|
||||
| Objective 5 (repository configuration) | [BC-001] |
|
||||
| Success criteria 4 and 5 | [BC-001] |
|
||||
|
||||
## Ownership
|
||||
|
||||
| Role | Stakeholder ID (SA) |
|
||||
| --- | --- |
|
||||
| Owner | S01 |
|
||||
| Approving reviewer | S01 |
|
||||
|
||||
## Target Date
|
||||
|
||||
2026-10-29 — inside the one-week window of the Business Case.
|
||||
|
||||
## Tasks
|
||||
|
||||
| # | Task | Summary | Needs its own Use Case/User Story? | Reference |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | Set repository description and topics | Set a short description and topics (python, selenium, udemy, 100-days-of-code, web-automation, pytest) on the git host through its API. The token is read from the shell environment loaded from `.env` by the operator and is never printed, committed, tested or imported by the project (CN-005). | No | |
|
||||
| 2 | Add Python .gitignore | Add a Python `.gitignore` that also ignores `.venv/`, `.env`, build output, caches and generated Doxygen output so that no secret or artifact is committed (CN-005). | No | |
|
||||
| 3 | Create pyproject.toml and package layout | Configure the project in `pyproject.toml` with `requires-python = ">=3.13"`, selenium as the only runtime dependency, pytest as a `dev` extra, and the `src/fill_out_form/` and `tests/` folders (CN-006). | No | |
|
||||
| 4 | Create constants.py | Put every URL, selector, link text, search term, field value and timeout in `constants.py` so the logic has no magic values (CN-003). | No | |
|
||||
| 5 | Add Doxyfile | Add a `Doxyfile` configured for Python sources in `src/` and write Doxygen-style comments in the skeleton (CN-003). | No | |
|
||||
| 6 | Write README with venv and test instructions | Create `README.md` from the framework template with how to create a local `.venv`, run `python -m pip install --upgrade pip`, install, run and test (CN-004). | No | |
|
||||
| 7 | Record dependency and fixture decisions as ADR-0001 | Record that selenium is the only runtime dependency, that the form step has a local HTML fixture because the original demo site may be offline, and that browser runs happen in Docker (CN-006). | No | |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../business-case.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,77 @@
|
||||
# MIL-002 Form automation
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | MIL-002 |
|
||||
| CrossReference | [BC-001] |
|
||||
| Language | en |
|
||||
| Domain | it |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
Decide whether the three lecture steps (click a link by its text, search and press Enter, fill out and submit a form) work, are tested, and have screenshots.
|
||||
|
||||
## Deliverable
|
||||
|
||||
Branch `mil-002-form-automation` with the `fill_out_form` package, a runnable entry point, pytest tests, a local form fixture, and one screenshot per lecture step in `docs/images/`, captured in Docker.
|
||||
|
||||
## Go / No-Go Criteria
|
||||
|
||||
| # | Criterion (objectively checkable) | Go | No-Go |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | `pytest` exits 0 on the host without a browser | Exit 0 | Non-zero |
|
||||
| 2 | The Docker end-to-end run exits 0 and writes three screenshots | Exit 0 and three PNG files | Otherwise |
|
||||
| 3 | Every selector, URL and text is defined in `constants.py` | No literal selector or URL elsewhere under `src/` | Any found |
|
||||
| 4 | Public functions carry Doxygen comments | All public functions | Any missing |
|
||||
| 5 | The code review record against `QC-PY-001` is `Go` | Go | No-Go |
|
||||
|
||||
## Dependencies
|
||||
|
||||
| Depends on | Reason |
|
||||
| --- | --- |
|
||||
| [MIL-001] | Needs the project configuration, constants file and tooling |
|
||||
|
||||
## Traceability
|
||||
|
||||
| Business Case objective / KPI / user story | Reference |
|
||||
| --- | --- |
|
||||
| Objectives 1 and 2 | [BC-001] |
|
||||
| Success criteria 1 and 2 | [BC-001] |
|
||||
|
||||
## Ownership
|
||||
|
||||
| Role | Stakeholder ID (SA) |
|
||||
| --- | --- |
|
||||
| Owner | S01 |
|
||||
| Approving reviewer | S01 |
|
||||
|
||||
## Target Date
|
||||
|
||||
2026-11-01 — inside the one-week window of the Business Case.
|
||||
|
||||
## Tasks
|
||||
|
||||
| # | Task | Summary | Needs its own Use Case/User Story? | Reference |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | Implement driver factory | Create `create_driver` that returns a Chrome WebDriver, headless when requested, so the same code runs on a desktop-less Docker container (CN-002). | No | |
|
||||
| 2 | Implement click_link_by_text | Open the Wikipedia main page and click the link whose text is "Content portals" with `By.LINK_TEXT`, as the lecture shows (CN-002, CN-003). | No | |
|
||||
| 3 | Implement search_for | Find the search input by its `name` attribute, type "Python" and press `Keys.ENTER` (CN-002, CN-003). | No | |
|
||||
| 4 | Implement fill_out_form | Find first name, last name and email fields with CSS selectors, type the values from `constants.py` and click the sign-up button (CN-002, CN-003). | No | |
|
||||
| 5 | Add the main entry point | Add `python -m fill_out_form` that runs the three steps in order and optionally saves a screenshot after each step (CN-004, CN-007). | No | |
|
||||
| 6 | Add local form fixture and unit tests | Add an HTML form fixture with the same field names and pytest tests that use a fake driver for the logic and need no browser (CN-002). | No | |
|
||||
| 7 | Run end-to-end in Docker and capture screenshots | Run the three steps in a headless Chrome Docker container with a shared results folder (Docker container; never the host desktop) and save one screenshot per step to `docs/images/` (CN-007). | No | |
|
||||
| 8 | Review code against the Python checklist | Review `src/` and `tests/` against `qc-programming-python` and record the `RC-*` before the pull request. | No | |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../business-case.md
|
||||
[MIL-001]: ./mil-001-project-setup.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,74 @@
|
||||
# MIL-003 Documentation and wiki
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | MIL-003 |
|
||||
| CrossReference | [BC-001] |
|
||||
| Language | en |
|
||||
| Domain | it |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
Decide whether the project is explained well enough for course participants and GitHub viewers: a README with screenshots and a wiki in three languages describing what each lecture step teaches.
|
||||
|
||||
## Deliverable
|
||||
|
||||
Branch `mil-003-documentation` with the finished `README.md` showing the screenshots, and the wiki in `docs/wiki/` in English, Danish and Bahasa Malaysia with the same page set and screenshots.
|
||||
|
||||
## Go / No-Go Criteria
|
||||
|
||||
| # | Criterion (objectively checkable) | Go | No-Go |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | The README shows one screenshot per lecture step and `check-readme.sh` passes | Both | Either fails |
|
||||
| 2 | Every English wiki page has a `-da` and a `-ms` twin | Same page set in 3 languages | A page is missing |
|
||||
| 3 | Each language line links to the other two languages | All links present | Any missing |
|
||||
| 4 | Each wiki page explains what was gained in its lecture step | One section per step | Any missing |
|
||||
| 5 | The review record of the wiki against the rules of `framework/process/wiki.md` is `Go` | Go | No-Go |
|
||||
|
||||
## Dependencies
|
||||
|
||||
| Depends on | Reason |
|
||||
| --- | --- |
|
||||
| [MIL-002] | Needs the working code and the screenshots |
|
||||
|
||||
## Traceability
|
||||
|
||||
| Business Case objective / KPI / user story | Reference |
|
||||
| --- | --- |
|
||||
| Objectives 3 and 4 | [BC-001] |
|
||||
| Success criteria 2, 3 and 6 | [BC-001] |
|
||||
|
||||
## Ownership
|
||||
|
||||
| Role | Stakeholder ID (SA) |
|
||||
| --- | --- |
|
||||
| Owner | S01 |
|
||||
| Approving reviewer | S01 |
|
||||
|
||||
## Target Date
|
||||
|
||||
2026-11-04 — the last day of the one-week window of the Business Case.
|
||||
|
||||
## Tasks
|
||||
|
||||
| # | Task | Summary | Needs its own Use Case/User Story? | Reference |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | Finish README with screenshots | Add the three lecture-step screenshots, the run and test instructions and the appendix of project documents to `README.md` (CN-004, CN-007). | No | |
|
||||
| 2 | Write English wiki | Write `Home`, one page per lecture step ("Link click", "Search", "Form") and `_Sidebar` in `docs/wiki/`, each explaining what was gained and showing the screenshot (CN-007). | No | |
|
||||
| 3 | Write Danish wiki | Translate every English wiki page into Danish as `<Page>-da.md`, keeping code, commands and file names in English (CN-007). | No | |
|
||||
| 4 | Write Bahasa Malaysia wiki | Translate every English wiki page into Bahasa Malaysia as `<Page>-ms.md`, keeping code, commands and file names in English (CN-007). | No | |
|
||||
| 5 | Review wiki against the wiki rules | Review the three wiki languages against `framework/process/wiki.md` (no checklist exists for a wiki) and record the `RC-*` before the pull request. | No | |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../business-case.md
|
||||
[MIL-002]: ./mil-002-form-automation.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,92 @@
|
||||
# Project Plan
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | PP-001 |
|
||||
| CrossReference | [BC-001], [SA-001], [MIL-001], [MIL-002], [MIL-003] |
|
||||
| Language | en |
|
||||
| Domain | it |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
This plan schedules three gateways that deliver the Day 48 Selenium form project within the one-week constraint of [BC-001].
|
||||
|
||||
## Planning Assumptions
|
||||
|
||||
- Week 1 starts 2026-10-28; the plan ends 2026-11-04, per the Business Case constraint.
|
||||
- Phase length: one to four days, one pull request per phase ([SA-001] concern CN-001).
|
||||
- The AI works in autonomous mode after the user accepts this plan.
|
||||
|
||||
## Gateway Schedule
|
||||
|
||||
| Gateway | Document | Window | Decision date | Owner | Stories | Main deliverable | Milestone |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| Project setup | [MIL-001] | 2026-10-28 to 2026-10-29 | 2026-10-29 | S01 | none (technical tasks) | Configured repository, skeleton, README, ADR | [M-282] |
|
||||
| Form automation | [MIL-002] | 2026-10-30 to 2026-11-01 | 2026-11-01 | S01 | none (technical tasks) | Code, tests and screenshots for the three lecture steps | [M-283] |
|
||||
| Documentation and wiki | [MIL-003] | 2026-11-02 to 2026-11-04 | 2026-11-04 | S01 | none (technical tasks) | README with screenshots and a three-language wiki | [M-284] |
|
||||
|
||||
```plantuml
|
||||
@startgantt
|
||||
Project starts 2026-10-28
|
||||
[Project setup] starts 2026-10-28 and ends 2026-10-29
|
||||
[Project setup Go/No-Go] happens 2026-10-29
|
||||
[Form automation] starts 2026-10-30 and ends 2026-11-01
|
||||
[Form automation Go/No-Go] happens 2026-11-01
|
||||
[Documentation and wiki] starts 2026-11-02 and ends 2026-11-04
|
||||
[Documentation and wiki Go/No-Go] happens 2026-11-04
|
||||
@endgantt
|
||||
```
|
||||
|
||||
## Scope Coverage
|
||||
|
||||
| Business Case scope item | Gateway |
|
||||
| --- | --- |
|
||||
| Python package under `src/`, tests, constants | [MIL-002] |
|
||||
| `pyproject.toml`, venv instructions, `.gitignore`, Doxyfile | [MIL-001] |
|
||||
| README from the framework template | [MIL-001] (skeleton), [MIL-003] (final) |
|
||||
| Wiki in English, Danish and Bahasa Malaysia | [MIL-003] |
|
||||
| Screenshots for each lecture step | [MIL-002] (capture), [MIL-003] (use) |
|
||||
| Repository description and topics | [MIL-001] |
|
||||
|
||||
## Dependencies
|
||||
|
||||
```
|
||||
MIL-001 → MIL-002 → MIL-003
|
||||
```
|
||||
|
||||
A No-Go on a gateway delays every later gateway by the days needed for rework. Only S01 may move the end date 2026-11-04.
|
||||
|
||||
## Plan Risks
|
||||
|
||||
| Risk | Impact | Mitigation |
|
||||
| --- | --- | --- |
|
||||
| The Docker browser run fails | MIL-002 and MIL-003 slip | Fix the image or configuration; stop and report after three failed attempts on one cause |
|
||||
| Translation takes longer than planned | MIL-003 slips | English is written first; translations follow page by page |
|
||||
| The git host token lacks scope | Description and topics cannot be set | Stop and report; S01 supplies a token with repository scope |
|
||||
|
||||
## Open Issues
|
||||
|
||||
- The assignment gives no function names. The plan uses `create_driver`, `click_link_by_text`, `search_for` and `fill_out_form`; S01 may rename them at review.
|
||||
- The assignment's original form URL is not confirmed to be online; a local fixture is used and the original URL is kept as a constant.
|
||||
- The repository URL in the request (`Tirsvad-Udemy-100_days_of_code`) differs from `origin` (`Tirsvad-Udemy-100-days-of-code/048-fill-out-form`); the plan uses `origin`.
|
||||
- No governance document, dictionary or traceability matrix exists yet; the README appendix lists only existing documents.
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ./business-case.md
|
||||
[SA-001]: ./stakeholder-analysis.md
|
||||
[MIL-001]: ./milestones/mil-001-project-setup.md
|
||||
[MIL-002]: ./milestones/mil-002-form-automation.md
|
||||
[MIL-003]: ./milestones/mil-003-documentation.md
|
||||
[M-282]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/milestones/282
|
||||
[M-283]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/milestones/283
|
||||
[M-284]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/milestones/284
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,68 @@
|
||||
# SQA Review Record: BC-001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-001 |
|
||||
| CrossReference | [BC-001], [QC-BC-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [BC-001]
|
||||
- Checklist used: [QC-BC-001]
|
||||
- Scope: full review
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the reviewer reads English and knows the IT domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | ROI/Cost-Benefit analysis is quantitative, or where qualitative, is explicitly justified | Pass | Cost-Benefit is qualitative and says why (unpaid learning work, no revenue). |
|
||||
| 2 | Risks are identified with documented impact and mitigation | Pass | Five risks, each with impact and mitigation. |
|
||||
| 3 | Success criteria are measurable, stating explicit targets rather than vague aspirations | Pass | Six success criteria, each with a target and a measure. |
|
||||
| 4 | Scope explicitly separates In Scope vs Out of Scope | Pass | Separate `### In Scope` and `### Out of Scope` sections. |
|
||||
| 5 | Stakeholders are cross-referenced to Stakeholder Analysis IDs rather than re-described inline | Pass | Stakeholders table cites S01, S02, S03 and CN-IDs only. |
|
||||
| 6 | Methodology and quality-standard foundation are stated explicitly (e.g. ISO/IEC 25010, Larman) | Pass | Foundation section names the framework, ISO/IEC 25010:2023, coding conventions. |
|
||||
| 7 | Assumptions and constraints are explicit and clearly distinguished from one another | Pass | Separate Assumptions and Constraints lists. |
|
||||
| 8 | Document supports executive decision-making with a clear, unambiguous recommendation | Pass | Recommendation: Proceed, one sentence. |
|
||||
|
||||
## Language and Domain Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata has `Language` = en and `Domain` = it. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is BCP 47; `it` is in the registry domain list. |
|
||||
| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and table cells are English. |
|
||||
| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English for BC, PP and MIL; IT Professional English for SA, as the registry states. |
|
||||
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists yet; only standard IT terms are used, with no synonyms for one concept. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Keys, headings, IDs and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No translated twin exists beside the document. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | First version: no earlier accepted version, so no language change. |
|
||||
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer (AI as stand-in for S01) reads English and knows the IT domain; not independent. |
|
||||
| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Abbreviations (ADR, PO, CI, FURPS+) are known to the audience or spelled out. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — every Mandatory criterion passes; no blocking finding.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | n/a |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../../business-case.md
|
||||
[QC-BC-001]: ../../../framework/qc/artifacts/qc-business-case.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,69 @@
|
||||
# SQA Review Record: SA-001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-002 |
|
||||
| CrossReference | [SA-001], [QC-SA-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [SA-001]
|
||||
- Checklist used: [QC-SA-001]
|
||||
- Scope: full review
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the reviewer reads English and knows the IT domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | Power/Interest grid is filled for every stakeholder, with no gaps or unclassified entries | Pass | S01, S02, S03 all have power, interest and quadrant. |
|
||||
| 2 | Each stakeholder is assigned a unique, stable ID (e.g. S01-S11 style) reusable for RACI assignments in other artifacts | Pass | Stable IDs S01-S03. |
|
||||
| 3 | Roles and organizational context are defined with explicit Power and Interest levels, not just narrative description | Pass | Role, organisation, power and interest in the summary table. |
|
||||
| 4 | Communication needs (channel, frequency, deliverable type) are mapped to project phases or milestones | Pass | Communication table C-01 to C-03 maps to milestones. |
|
||||
| 5 | Conflicting stakeholder interests are identified with documented mitigation or resolution strategies | Pass | Two conflicts, each with a mitigation. |
|
||||
| 6 | Stakeholder concerns are explicitly traced to Business Case objectives | Pass | Traceability table cites BC-001 objectives. |
|
||||
| 7 | Primary concerns are expressed in both business language and a recognized quality-attribute mapping (e.g. FURPS+) | Pass | Concern register maps each concern to a FURPS+ attribute. |
|
||||
| 8 | Document is understandable and navigable by non-technical stakeholders reviewing their own entry | Pass | Short entries in plain language. |
|
||||
| 9 | Every concern has a stable ID (`CN-NNN`) in the concern register, with the stakeholder who raised it; IDs are never renumbered or reused | Pass | CN-001 to CN-007, each with the stakeholder who raised it. |
|
||||
|
||||
## Language and Domain Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata has `Language` = en and `Domain` = it. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is BCP 47; `it` is in the registry domain list. |
|
||||
| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and table cells are English. |
|
||||
| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English for BC, PP and MIL; IT Professional English for SA, as the registry states. |
|
||||
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists yet; only standard IT terms are used, with no synonyms for one concept. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Keys, headings, IDs and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No translated twin exists beside the document. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | First version: no earlier accepted version, so no language change. |
|
||||
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer (AI as stand-in for S01) reads English and knows the IT domain; not independent. |
|
||||
| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Abbreviations (ADR, PO, CI, FURPS+) are known to the audience or spelled out. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — every Mandatory criterion passes; no blocking finding.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | n/a |
|
||||
|
||||
---
|
||||
|
||||
[SA-001]: ../../stakeholder-analysis.md
|
||||
[QC-SA-001]: ../../../framework/qc/artifacts/qc-stakeholder-analysis.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,75 @@
|
||||
# SQA Review Record: PP-001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-003 |
|
||||
| CrossReference | [PP-001], [QC-PP-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [PP-001]
|
||||
- Checklist used: [QC-PP-001]
|
||||
- Scope: full review
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the reviewer reads English and knows the IT domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | The plan states its start date, end date and the constraint it must fit | Pass | Start 2026-10-28, end 2026-11-04, the one-week constraint of BC-001. |
|
||||
| 2 | Every milestone or gateway is listed once with its document, decision date and owner | Pass | Three gateways, each with its MIL document, decision date and owner. |
|
||||
| 3 | Every decision date lies inside the plan's window and is consistent with the dates in the linked `MIL-*` document | Pass | Decision dates equal the MIL target dates (10-29, 11-01, 11-04) and lie inside the window. |
|
||||
| 4 | Every in-scope item of the Business Case is delivered at a named gateway (scope coverage) | Pass | Scope Coverage table maps every in-scope item to a gateway. |
|
||||
| 5 | Dependencies between gateways are stated, acyclic and consistent with the schedule order | Pass | Chain MIL-001 to MIL-002 to MIL-003, in schedule order. |
|
||||
| 6 | The plan states what happens to later gateways and to the end date when a gateway is No-Go | Pass | States the delay and that only S01 moves the end date. |
|
||||
| 7 | Owners, reviewers and escalation roles use Stakeholder Analysis IDs and match the governance RACI | Pass | Owners are S-IDs. No governance document exists yet, so no RACI to match; recorded in Open Issues. |
|
||||
| 8 | Planning assumptions are listed with their source, and a changed baseline is recorded with its reason | Pass | Assumptions cite BC-001 and SA-001. |
|
||||
| 9 | Plan risks are listed with impact and a mitigation, and trace to Business Case risks where they come from there | Pass | Three plan risks with impact and mitigation. |
|
||||
| 10 | Open issues are listed, and none contradicts a statement elsewhere in the plan | Pass | Open issues are current and do not contradict the plan. |
|
||||
| 11 | Each gateway's main deliverable is stated and matches the deliverable of its `MIL-*` document | Pass | Deliverables match the Deliverable of each MIL document. |
|
||||
| 12 | Gateways that deliver user stories name them, and those that do not say why | Pass | Stories column says none (technical tasks). |
|
||||
| 13 | The schedule view (table, Gantt) and the dependency view agree with each other | Pass | Table, Gantt and dependency chain agree. |
|
||||
| 14 | Each gateway is linked to its issue-tracker milestone, or marked as not yet synced | Pass | Column says not yet synced; updated after the sync. |
|
||||
| 15 | The plan is a singleton: one Project Plan per project, changes recorded in Version History | Pass | Single plan, Version History kept. |
|
||||
|
||||
## Language and Domain Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata has `Language` = en and `Domain` = it. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is BCP 47; `it` is in the registry domain list. |
|
||||
| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and table cells are English. |
|
||||
| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English for BC, PP and MIL; IT Professional English for SA, as the registry states. |
|
||||
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists yet; only standard IT terms are used, with no synonyms for one concept. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Keys, headings, IDs and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No translated twin exists beside the document. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | First version: no earlier accepted version, so no language change. |
|
||||
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer (AI as stand-in for S01) reads English and knows the IT domain; not independent. |
|
||||
| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Abbreviations (ADR, PO, CI, FURPS+) are known to the audience or spelled out. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — every Mandatory criterion passes; no blocking finding.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | n/a |
|
||||
|
||||
---
|
||||
|
||||
[PP-001]: ../../project-plan.md
|
||||
[QC-PP-001]: ../../../framework/qc/artifacts/qc-project-plan.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,66 @@
|
||||
# SQA Review Record: MIL-001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-004 |
|
||||
| CrossReference | [MIL-001], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-001]
|
||||
- Checklist used: [QC-MIL-001]
|
||||
- Scope: full review
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the reviewer reads English and knows the IT domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | A concrete deliverable is defined for every gate | Pass | The Deliverable section names the branch and its files. |
|
||||
| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Go/No-Go table with objectively checkable criteria. |
|
||||
| 3 | Dependencies on other milestones are explicitly mapped | Pass | Dependencies table. |
|
||||
| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability cites BC-001 objectives and success criteria. |
|
||||
| 5 | Milestone owner and approving reviewer are identified | Pass | Owner and approving reviewer are S01. |
|
||||
| 6 | Milestone has a defined target date consistent with project constraints | Pass | Target date lies in 2026-10-28 to 2026-11-04. |
|
||||
|
||||
## Language and Domain Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata has `Language` = en and `Domain` = it. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is BCP 47; `it` is in the registry domain list. |
|
||||
| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and table cells are English. |
|
||||
| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English for BC, PP and MIL; IT Professional English for SA, as the registry states. |
|
||||
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists yet; only standard IT terms are used, with no synonyms for one concept. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Keys, headings, IDs and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No translated twin exists beside the document. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | First version: no earlier accepted version, so no language change. |
|
||||
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer (AI as stand-in for S01) reads English and knows the IT domain; not independent. |
|
||||
| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Abbreviations (ADR, PO, CI, FURPS+) are known to the audience or spelled out. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — every Mandatory criterion passes; no blocking finding.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | n/a |
|
||||
|
||||
---
|
||||
|
||||
[MIL-001]: ../../milestones/mil-001-project-setup.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,66 @@
|
||||
# SQA Review Record: MIL-002
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-005 |
|
||||
| CrossReference | [MIL-002], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-002]
|
||||
- Checklist used: [QC-MIL-001]
|
||||
- Scope: full review
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the reviewer reads English and knows the IT domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | A concrete deliverable is defined for every gate | Pass | The Deliverable section names the branch and its files. |
|
||||
| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Go/No-Go table with objectively checkable criteria. |
|
||||
| 3 | Dependencies on other milestones are explicitly mapped | Pass | Dependencies table. |
|
||||
| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability cites BC-001 objectives and success criteria. |
|
||||
| 5 | Milestone owner and approving reviewer are identified | Pass | Owner and approving reviewer are S01. |
|
||||
| 6 | Milestone has a defined target date consistent with project constraints | Pass | Target date lies in 2026-10-28 to 2026-11-04. |
|
||||
|
||||
## Language and Domain Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata has `Language` = en and `Domain` = it. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is BCP 47; `it` is in the registry domain list. |
|
||||
| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and table cells are English. |
|
||||
| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English for BC, PP and MIL; IT Professional English for SA, as the registry states. |
|
||||
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists yet; only standard IT terms are used, with no synonyms for one concept. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Keys, headings, IDs and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No translated twin exists beside the document. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | First version: no earlier accepted version, so no language change. |
|
||||
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer (AI as stand-in for S01) reads English and knows the IT domain; not independent. |
|
||||
| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Abbreviations (ADR, PO, CI, FURPS+) are known to the audience or spelled out. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — every Mandatory criterion passes; no blocking finding.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | n/a |
|
||||
|
||||
---
|
||||
|
||||
[MIL-002]: ../../milestones/mil-002-form-automation.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,66 @@
|
||||
# SQA Review Record: MIL-003
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-006 |
|
||||
| CrossReference | [MIL-003], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-003]
|
||||
- Checklist used: [QC-MIL-001]
|
||||
- Scope: full review
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the reviewer reads English and knows the IT domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | A concrete deliverable is defined for every gate | Pass | The Deliverable section names the branch and its files. |
|
||||
| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Go/No-Go table with objectively checkable criteria. |
|
||||
| 3 | Dependencies on other milestones are explicitly mapped | Pass | Dependencies table. |
|
||||
| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability cites BC-001 objectives and success criteria. |
|
||||
| 5 | Milestone owner and approving reviewer are identified | Pass | Owner and approving reviewer are S01. |
|
||||
| 6 | Milestone has a defined target date consistent with project constraints | Pass | Target date lies in 2026-10-28 to 2026-11-04. |
|
||||
|
||||
## Language and Domain Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata has `Language` = en and `Domain` = it. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is BCP 47; `it` is in the registry domain list. |
|
||||
| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and table cells are English. |
|
||||
| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English for BC, PP and MIL; IT Professional English for SA, as the registry states. |
|
||||
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists yet; only standard IT terms are used, with no synonyms for one concept. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Keys, headings, IDs and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No translated twin exists beside the document. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | First version: no earlier accepted version, so no language change. |
|
||||
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer (AI as stand-in for S01) reads English and knows the IT domain; not independent. |
|
||||
| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Abbreviations (ADR, PO, CI, FURPS+) are known to the audience or spelled out. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — every Mandatory criterion passes; no blocking finding.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | n/a |
|
||||
|
||||
---
|
||||
|
||||
[MIL-003]: ../../milestones/mil-003-documentation.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,55 @@
|
||||
# SQA Review Record: ADR-0001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-007 |
|
||||
| CrossReference | [ADR-0001], [QC-ADR-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [ADR-0001]
|
||||
- Checklist used: [QC-ADR-001]
|
||||
- Scope: full review
|
||||
- Language and domain: n/a (technical type)
|
||||
- Language reviewer: none
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | The ID (`ADR-NNNN`, 4-digit) matches the filename number and is unique and sequential | Pass | ID ADR-0001 matches the filename adr-0001; first and only ADR. |
|
||||
| 2 | Context states the problem, the forces (cost, risk, constraints) and the options evaluated | Pass | Context gives the problem, forces and three options (a, b, c). |
|
||||
| 3 | At least two options were considered, or the absence of alternatives is justified | Pass | Three options considered. |
|
||||
| 4 | Decision is stated in one or two unhedged sentences and matches one of the evaluated options | Pass | Decision is two sentences and is option (c) without the helper libraries of (a). |
|
||||
| 5 | Consequences list both Positive and Negative outcomes | Pass | Positive and Negative lists present. |
|
||||
| 6 | Quality-attribute impacts (performance, security, portability, etc.) are named where the decision affects them | Pass | Portability (Docker), security (no .env read) and dependency footprint are named. |
|
||||
| 7 | Affected Artifacts are listed as links, and each is also in CrossReference | Pass | BC-001 is listed in Affected Artifacts and in CrossReference. |
|
||||
| 8 | Status changes are recorded as new Version History rows with a Change summary and Commit link; retained rows are never rewritten | Pass | One row, commit link resolved after the commit. |
|
||||
| 9 | A superseded or deprecated ADR names its successor, and the successor links back | Pass | Not superseded. |
|
||||
| 10 | Written in business or technical language of the domain, with no unexplained abbreviations | Pass | Plain technical language. |
|
||||
| 11 | Status is one of `Proposed`, `Accepted`, `Rejected`, `Deprecated` or `Superseded by ADR-NNNN`, and every Version History row uses only these | Pass | Status Accepted is an allowed value. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — every Mandatory criterion passes; no blocking finding.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | n/a |
|
||||
|
||||
---
|
||||
|
||||
[ADR-0001]: ../../adr/adr-0001-dependencies-fixture-docker.md
|
||||
[QC-ADR-001]: ../../../framework/qc/artifacts/qc-adr.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,62 @@
|
||||
# SQA Review Record: code of MIL-001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-008 |
|
||||
| CrossReference | [MIL-001], [QC-PY-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-001]
|
||||
- Checklist used: [QC-PY-001]
|
||||
- Scope: full review
|
||||
- Language and domain: n/a (technical type)
|
||||
- Language reviewer: none
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | Packages, modules, functions, variables, classes and constants follow PEP 8 casing (`snake_case`, `PascalCase`, `UPPER_SNAKE`) | Pass | Names are snake_case, UPPER_SNAKE for constants, PascalCase for classes. |
|
||||
| 2 | Names state purpose in the domain's language; no unexplained abbreviations, no single-letter names outside tiny scopes | Pass | Names state purpose (`LINK_TEXT_CONTENT_PORTALS`, `SEARCH_TERM`). |
|
||||
| 3 | Code is produced by the project's formatter and passes its linter with no unexplained suppressions | Pass | `ruff check` and `ruff format --check` pass. |
|
||||
| 4 | Every function and method signature is type-annotated, including `-> None` | Pass | `mypy --strict` passes; the test function is annotated `-> None`. |
|
||||
| 5 | No bare `except:`, no swallowed exceptions; specific exceptions are raised and the cause is kept (`raise ... from`) | Pass | No exception handling in the skeleton. |
|
||||
| 6 | No mutable default arguments and no shadowed builtins | Pass | No mutable defaults and no shadowed builtins. |
|
||||
| 7 | Files, locks and connections are managed with context managers | Pass | No files or connections in the skeleton. |
|
||||
| 8 | Public modules, classes and functions have docstrings that say what, not how | Pass | Every module has a docstring with Doxygen commands. |
|
||||
| 9 | Logging uses `logging`, not `print`; no secrets or personal data in log output | Pass | No output or logging in the skeleton; no secrets. |
|
||||
| 10 | Classes and operations trace to the Design Class Diagram they implement; deviations are recorded | N-A | N-A: no Design Class Diagram exists; the tasks are plain technical tasks. |
|
||||
| 11 | Tests exist for new behaviour, are named for the behaviour, and do not depend on order or the network | Pass | `tests/unit/test_constants.py` guards the constants against Selenium; offline. |
|
||||
| 12 | Type checker runs in strict mode without errors; `Any` is justified in a comment | Pass | `mypy --strict` runs without errors. |
|
||||
| 13 | Dependencies are declared and pinned in the project's dependency file, none unused | Pass | `selenium>=4.25,<5` is the only runtime dependency, used by the tests and the next milestone. |
|
||||
| 14 | Each piece of knowledge (a business rule, constant, format, validation or query) is defined in one place; code is merged only where it expresses the same knowledge, not where it merely looks alike | Pass | Every URL, locator and text is defined once in `constants.py`. |
|
||||
| 15 | Imports point inward: business-rule modules import no framework, database, UI or delivery-mechanism code, and there are no import cycles | Pass | The layer packages exist; no module imports an outer layer. |
|
||||
| 16 | SOLID holds: a class or module has one reason to change; new behaviour is added by extension, not by editing a type test in several places; subclasses honour the contract of their base; protocols are narrow; high-level code depends on protocols or abstract types and receives its implementations | Pass | No class yet; modules have one purpose each. |
|
||||
| 17 | Source is laid out in the layers and folders of the clean architecture folder structure (`domain`, `application`, `infrastructure`, `presentation` packages under `src/`, and `unit`, `integration` and `e2e` under `tests/`), in `snake_case`, and imports between the layers point inward | Pass | `domain`, `application`, `infrastructure` and `presentation` under `src/fill_out_form/`; `unit`, `e2e` and `fixtures` under `tests/`. |
|
||||
| 18 | File and folder names are English, contain no space and no character outside letters, digits, `-`, `_` and `.`, and follow the casing of the language for files | Pass | All names are English, without space, in the allowed characters. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — every Mandatory criterion passes; no blocking finding. Reviewed files: skeleton under src/ and tests/ of MIL-001.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | n/a |
|
||||
|
||||
---
|
||||
|
||||
[MIL-001]: ../../milestones/mil-001-project-setup.md
|
||||
[QC-PY-001]: ../../../framework/qc/code/qc-programming-python.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,73 @@
|
||||
# Traceability Matrix
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | TM-001 |
|
||||
| CrossReference | [BC-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
Tracks backward/forward links between artifact instances so that the Business Case's
|
||||
cross-artifact traceability success criterion is measurable. A row is added or
|
||||
updated whenever an artifact instance is created or reviewed.
|
||||
|
||||
## Traceability Table
|
||||
|
||||
| Artifact Instance | Type | Language | Domain | Upstream (Backward Link) | Downstream (Forward Link) | Last Reviewed (RC-ID) |
|
||||
| --- | --- | --- | --- | --- | --- | --- |
|
||||
| [BC-001] | BC | en | it | - | [SA-001], [PP-001] | [RC-001] |
|
||||
| [SA-001] | SA | en | it | [BC-001] | [PP-001] | [RC-002] |
|
||||
| [PP-001] | PP | en | it | [BC-001], [SA-001] | [MIL-001], [MIL-002], [MIL-003] | [RC-003] |
|
||||
| [MIL-001] | MIL | en | it | [PP-001] | [MIL-002], [ADR-0001] | [RC-004], [RC-008] (code) |
|
||||
| [MIL-002] | MIL | en | it | [MIL-001] | [MIL-003] | [RC-005] |
|
||||
| [MIL-003] | MIL | en | it | [MIL-002] | - | [RC-006] |
|
||||
| [ADR-0001] | ADR | - | - | [BC-001], [MIL-001] | - | [RC-007] |
|
||||
|
||||
## Concern Coverage
|
||||
|
||||
| Concern (CN-ID) | Views that answer it | Decisions (ADR) | Quality check (TP) | Status |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| CN-001 | [PP-001], [MIL-001], [MIL-002], [MIL-003] | - | - | Covered |
|
||||
| CN-002 | [MIL-002] | - | - | Covered |
|
||||
| CN-003 | [MIL-001], [MIL-002] | - | - | Covered |
|
||||
| CN-004 | [MIL-001], [MIL-003] | - | - | Covered |
|
||||
| CN-005 | [MIL-001] | - | - | Covered |
|
||||
| CN-006 | [MIL-001] | [ADR-0001] | - | Covered |
|
||||
| CN-007 | [MIL-002], [MIL-003] | - | - | Covered |
|
||||
|
||||
## Open Inconsistencies
|
||||
|
||||
| # | Views | Inconsistency | Found in (RC-ID) | Status | Resolved in |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
|
||||
## Coverage Notes
|
||||
|
||||
- No instance exists yet of the other artifact types (KPI, BMC, BPMN, UCD, US, UC, design artifacts, TP, GOV, DICT); the tasks of all milestones are plain technical tasks.
|
||||
- `-` in Upstream means foundational; in Downstream it means nothing is built on it yet.
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../business-case.md
|
||||
[SA-001]: ../stakeholder-analysis.md
|
||||
[PP-001]: ../project-plan.md
|
||||
[MIL-001]: ../milestones/mil-001-project-setup.md
|
||||
[MIL-002]: ../milestones/mil-002-form-automation.md
|
||||
[MIL-003]: ../milestones/mil-003-documentation.md
|
||||
[RC-001]: ./reviews/rc-001-business-case.md
|
||||
[RC-002]: ./reviews/rc-002-stakeholder-analysis.md
|
||||
[RC-003]: ./reviews/rc-003-project-plan.md
|
||||
[RC-004]: ./reviews/rc-004-mil-001-project-setup.md
|
||||
[RC-005]: ./reviews/rc-005-mil-002-form-automation.md
|
||||
[RC-006]: ./reviews/rc-006-mil-003-documentation.md
|
||||
[ADR-0001]: ../adr/adr-0001-dependencies-fixture-docker.md
|
||||
[RC-007]: ./reviews/rc-007-adr-0001.md
|
||||
[RC-008]: ./reviews/rc-008-code-mil-001.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
@@ -0,0 +1,81 @@
|
||||
# Stakeholder Analysis
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | SA-001 |
|
||||
| CrossReference | [BC-001] |
|
||||
| Language | en |
|
||||
| Domain | it |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] |
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
This analysis names the people who care about the project, so that owners, reviewers and concerns can be cited by ID. It uses the power/interest grid and maps each concern to a FURPS+ attribute. It supports [BC-001].
|
||||
|
||||
## Stakeholder Summary Table
|
||||
|
||||
| ID | Name | Role/Title | Organization | Power Level | Interest Level | Quadrant | Primary Concern (Business Language) |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| S01 | Jens Tirsvad Nielsen | Course participant, Product Owner, developer and reviewer | Private | HIGH | HIGH | Manage Closely | A tidy, correct and well documented solution for the course portfolio |
|
||||
| S02 | Udemy coursists | Course participants who share and compare solutions | Udemy community | LOW | HIGH | Keep Informed | Readable, runnable code with the assignment's function names, and README instructions to run it |
|
||||
| S03 | GitHub viewers | Visitors who browse the repository for ideas | Public | LOW | MEDIUM | Monitor | A clear repository description, topics and README, and no unnecessary runtime dependencies |
|
||||
|
||||
## Power/Interest Classification Rationale
|
||||
|
||||
- **Manage Closely (S01):** decides scope, reviews and accepts every artifact.
|
||||
- **Keep Informed (S02):** cannot change the project, but whether they can run the code decides whether it is useful. They get the README and the wiki.
|
||||
- **Monitor (S03):** casual visitors, served by the repository metadata and the README.
|
||||
|
||||
## Primary Concerns and FURPS+ Mapping
|
||||
|
||||
| Concern ID | Stakeholder | Concern | FURPS+ attribute |
|
||||
| --- | --- | --- | --- |
|
||||
| CN-001 | S01 | Every change is planned, reviewed and traceable by pull request | Supportability |
|
||||
| CN-002 | S01 | The code is correct for all three lecture steps and tested | Functionality |
|
||||
| CN-003 | S02 | The code is readable and uses the assignment's function names | Usability |
|
||||
| CN-004 | S02 | The README tells how to create the venv, run the code and run the tests | Usability |
|
||||
| CN-005 | S03 | The repository has a description, topics and a clear README | Usability |
|
||||
| CN-006 | S03 | No runtime dependency except the one that is necessary | Supportability |
|
||||
| CN-007 | S01 | Each lecture step has a screenshot and a wiki text in three languages | Usability |
|
||||
|
||||
## Communication Requirements
|
||||
|
||||
| ID | Channel | Frequency | Deliverable | Phase / Milestone |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| C-01 | Chat with S01 | At plan acceptance and at the end of the run | Plan; run summary | All |
|
||||
| C-02 | Pull request | One per milestone | Changes and review records | MIL-001, MIL-002, MIL-003 |
|
||||
| C-03 | README and wiki | At each milestone that changes them | Instructions, screenshots, explanations | MIL-003 |
|
||||
|
||||
## Conflicting Interests and Mitigations
|
||||
|
||||
| Conflict | Stakeholders | Mitigation |
|
||||
| --- | --- | --- |
|
||||
| S02 wants the assignment's names; clean code conventions may prefer others | S01, S02 | Public functions keep the lecture's names; internals follow the conventions |
|
||||
| S01 wants documentation in three languages; S03 wants brevity | S01, S03 | The README stays short and links to the wiki for detail |
|
||||
|
||||
## Traceability Analysis
|
||||
|
||||
### Business Goal Alignment
|
||||
|
||||
| Stakeholder | Concern | Business Case objective |
|
||||
| --- | --- | --- |
|
||||
| S01 | CN-001, CN-002 | [BC-001] objectives 1 and 2 |
|
||||
| S01 | CN-007 | [BC-001] objectives 3 and 4 |
|
||||
| S02 | CN-003, CN-004 | [BC-001] objectives 1 and 3 |
|
||||
| S03 | CN-005, CN-006 | [BC-001] objective 5 |
|
||||
|
||||
## Sign-Off
|
||||
|
||||
Pending review. In autonomous mode the AI stands in for S01 as reviewer; the review record says "not independent".
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ./business-case.md
|
||||
[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520
|
||||
Submodule
+1
Submodule framework added at 7c2791939c
@@ -0,0 +1,51 @@
|
||||
[build-system]
|
||||
requires = ["setuptools>=68"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "fill-out-form"
|
||||
version = "0.1.0"
|
||||
description = "Udemy 100 Days of Code, Day 48: automate links, search and a sign-up form with Selenium."
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.13"
|
||||
license = "AGPL-3.0-only"
|
||||
license-files = ["LICENSE"]
|
||||
authors = [{ name = "Jens Tirsvad Nielsen" }]
|
||||
keywords = ["selenium", "udemy", "100-days-of-code", "web-automation"]
|
||||
dependencies = [
|
||||
"selenium>=4.25,<5",
|
||||
]
|
||||
|
||||
[project.optional-dependencies]
|
||||
dev = [
|
||||
"pytest>=8",
|
||||
"ruff>=0.6",
|
||||
"mypy>=1.11",
|
||||
]
|
||||
|
||||
[project.scripts]
|
||||
fill-out-form = "fill_out_form.presentation.cli:main"
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
where = ["src"]
|
||||
|
||||
[tool.pytest.ini_options]
|
||||
testpaths = ["tests"]
|
||||
pythonpath = ["src"]
|
||||
markers = ["e2e: runs a real browser; only inside the Docker container"]
|
||||
addopts = "-m 'not e2e'"
|
||||
|
||||
[tool.ruff]
|
||||
line-length = 88
|
||||
src = ["src", "tests"]
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = ["E", "F", "I", "B", "UP", "D"]
|
||||
ignore = ["D203", "D213"]
|
||||
|
||||
[tool.ruff.lint.per-file-ignores]
|
||||
"tests/**" = ["D"]
|
||||
|
||||
[tool.mypy]
|
||||
strict = true
|
||||
mypy_path = "src"
|
||||
@@ -0,0 +1,7 @@
|
||||
"""Day 48 of the Udemy 100 Days of Code course: fill out a form with Selenium.
|
||||
|
||||
@file __init__.py
|
||||
@brief Day 48 of the Udemy "100 Days of Code" course: fill out a form with Selenium.
|
||||
"""
|
||||
|
||||
__version__ = "0.1.0"
|
||||
@@ -0,0 +1,5 @@
|
||||
"""Application layer: the lecture steps, written against a small browser port.
|
||||
|
||||
@file __init__.py
|
||||
@brief Application layer: the lecture steps, written against a small browser port.
|
||||
"""
|
||||
@@ -0,0 +1,51 @@
|
||||
"""Every URL, locator, text and timing value of the lecture, defined once.
|
||||
|
||||
@file constants.py
|
||||
@brief Every URL, locator, text and timing value of the lecture, defined once.
|
||||
|
||||
The locator strategies are the plain strings that Selenium's `By` class holds
|
||||
(`By.LINK_TEXT == "link text"`); a unit test guards that they stay equal, so
|
||||
the application layer does not need to import Selenium.
|
||||
"""
|
||||
|
||||
# --- Pages -----------------------------------------------------------------
|
||||
WIKIPEDIA_URL = "https://en.wikipedia.org/wiki/Main_Page"
|
||||
FORM_URL = "https://secure-retreat-92358.herokuapp.com/"
|
||||
|
||||
# --- Locator strategies (equal to selenium.webdriver.common.by.By) ----------
|
||||
BY_LINK_TEXT = "link text"
|
||||
BY_NAME = "name"
|
||||
BY_CSS_SELECTOR = "css selector"
|
||||
|
||||
# --- Lecture step 1: click a link by its text -------------------------------
|
||||
LINK_TEXT_CONTENT_PORTALS = "Content portals"
|
||||
|
||||
# --- Lecture step 2: type into an input and send a special key --------------
|
||||
SEARCH_INPUT_NAME = "search"
|
||||
SEARCH_TERM = "Python"
|
||||
KEY_ENTER = "" # selenium.webdriver.common.keys.Keys.ENTER
|
||||
|
||||
# --- Lecture step 3: fill out the form (challenge) --------------------------
|
||||
FIRST_NAME_SELECTOR = "input[name='fName']"
|
||||
LAST_NAME_SELECTOR = "input[name='lName']"
|
||||
EMAIL_SELECTOR = "input[name='email']"
|
||||
SIGN_UP_BUTTON_SELECTOR = "form button"
|
||||
DEFAULT_FIRST_NAME = "Jane"
|
||||
DEFAULT_LAST_NAME = "Doe"
|
||||
DEFAULT_EMAIL = "jane.doe@example.com"
|
||||
|
||||
# --- Browser ----------------------------------------------------------------
|
||||
PAUSE_SECONDS = 2.0
|
||||
WINDOW_SIZE = "1280,900"
|
||||
CHROME_BINARY_ENV = "CHROME_BIN"
|
||||
HEADLESS_ARGUMENTS = (
|
||||
"--headless=new",
|
||||
"--no-sandbox",
|
||||
"--disable-dev-shm-usage",
|
||||
)
|
||||
|
||||
# --- Screenshots (one per lecture step) ---------------------------------------
|
||||
SCREENSHOT_STEP_1 = "step-1-click-link.png"
|
||||
SCREENSHOT_STEP_2 = "step-2-search.png"
|
||||
SCREENSHOT_STEP_3_FILLED = "step-3-form-filled.png"
|
||||
SCREENSHOT_STEP_3_SIGNED_UP = "step-3-form-signed-up.png"
|
||||
@@ -0,0 +1,5 @@
|
||||
"""Domain layer: the values the lecture types into the form.
|
||||
|
||||
@file __init__.py
|
||||
@brief Domain layer: the values the lecture types into the form.
|
||||
"""
|
||||
@@ -0,0 +1,5 @@
|
||||
"""Infrastructure layer: the Selenium Chrome driver.
|
||||
|
||||
@file __init__.py
|
||||
@brief Infrastructure layer: the Selenium Chrome driver.
|
||||
"""
|
||||
@@ -0,0 +1,5 @@
|
||||
"""Presentation layer: the command line.
|
||||
|
||||
@file __init__.py
|
||||
@brief Presentation layer: the command line.
|
||||
"""
|
||||
@@ -0,0 +1,19 @@
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.common.keys import Keys
|
||||
|
||||
from fill_out_form import constants
|
||||
|
||||
|
||||
def test_locator_strategies_equal_selenium_by() -> None:
|
||||
assert constants.BY_LINK_TEXT == By.LINK_TEXT
|
||||
assert constants.BY_NAME == By.NAME
|
||||
assert constants.BY_CSS_SELECTOR == By.CSS_SELECTOR
|
||||
|
||||
|
||||
def test_enter_key_equals_selenium_keys_enter() -> None:
|
||||
assert constants.KEY_ENTER == Keys.ENTER
|
||||
|
||||
|
||||
def test_urls_use_https() -> None:
|
||||
assert constants.WIKIPEDIA_URL.startswith("https://")
|
||||
assert constants.FORM_URL.startswith("https://")
|
||||
Reference in New Issue
Block a user