Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/Beliagal/qa-report-automation/llms.txt

Use this file to discover all available pages before exploring further.

The metadata form is the first section of the QA panel and acts as the header of your entire report. Every field you fill in here is written directly into the INFORMACIÓN GENERAL block at the top of the exported PDF, giving readers immediate context about what application was tested, by whom, and against which requirements. Completing this section accurately before adding any test steps ensures a professional, traceable report from the start.

Metadata Fields

Each field in the grid maps to a key in the ReportData.metadata dictionary. The six primary fields are arranged in a two-row, three-column grid, followed by a full-width Dependencias entry and a free-text Resumen Ejecutivo area below.
Aplicación
string
required
The name of the application under test. Pre-populated with "Valoraclick" by default from ReportData.reset_data(). Update this if you are testing a different product or module.
Tester
string
required
The full name of the QA analyst performing the test execution. This value appears in the Tester cell of the PDF information table alongside Aplicación.
Fecha
string (DD/MM/YYYY)
required
The test execution date in DD/MM/YYYY format. The field enforces this format at the keystroke level — only digits (0–9) and the / separator are accepted. Strings longer than 10 characters are also rejected automatically. On export, validar_fecha() from logic.py performs a final regex check (^\d{2}/\d{2}/\d{4}$) and a datetime.strptime parse; if either fails, the export is halted with a warning dialog.
Historia de Usuario
string
The User Story ID or name that this test execution covers (e.g., HU-042). Useful for linking the report back to your project management tool.
Requisitos
string
A comma-separated list of requirement references that the test validates (e.g., REQ-101, REQ-102). This field is stored in ReportData.metadata under the key "Requisitos:".
Versión
string
The version number of the application build under test (e.g., 2.7.0). Appears alongside Fecha in the second row of the PDF information table.
Dependencias
string
A free-text description of any external services or components the application depends on (e.g., Auth Service v3, Payment Gateway API). This field spans the full width of the metadata grid — it is stored separately in ReportData.metadata under the key "dep" and synced via _sync() on export.
Resumen Ejecutivo
text
A multiline free-text area (CTkTextbox, 80 px tall) placed below the metadata grid. Use it to summarise the scope, objectives, and overall outcome of the test session. Its value is stored in ReportData.metadata under the key "resumen" and rendered in the Resumen row of the PDF information table via pdf.multi_cell().

Date Validation in Detail

Date input is protected by two layers:
  1. Keystroke filter (_validate_date_input) — registered as a Tkinter validatecommand (vcmd) on the Fecha entry widget. On every keypress it checks that the entire pending value (%P) contains only the characters 0123456789/ and is no longer than 10 characters. Any character that does not match is silently rejected before it reaches the field.
  2. Export-time validation (validar_fecha) — called inside _on_export() using a full regex match (^\d{2}/\d{2}/\d{4}$) followed by datetime.strptime(fecha_str, '%d/%m/%Y'). If either check fails — for example if the day or month is out of range — a warning dialog is shown and the PDF is not generated.
# logic.py — validar_fecha()
def validar_fecha(fecha_str):
    if not re.match(r"^\d{2}/\d{2}/\d{4}$", fecha_str):
        return False
    try:
        datetime.strptime(fecha_str, '%d/%m/%Y')
        return True
    except ValueError:
        return False

Metadata Sync on Export

None of the metadata widget values are pushed to ReportData continuously. Instead, the _sync() method is called at the moment you click EXPORTAR PDF. It iterates over all registered self.entries widgets, reads their current values, and writes them into self.report_data.metadata. The dep and resumen fields are handled separately because they come from self.ent_dep and self.txt_resumen respectively rather than the main entries dictionary.
# gui.py — _sync()
def _sync(self):
    m = self.report_data.metadata
    for k, v in self.entries.items():
        m[k] = v.get()
    m["dep"] = self.ent_dep.get()
    m["resumen"] = self.txt_resumen.get("1.0", "end-1c")
The Fecha field is pre-populated with today’s date in DD/MM/YYYY format when the application launches. This is set by datetime.datetime.now().strftime('%d/%m/%Y') inside _setup_metadata_grid(), so you only need to change it if you are logging a test that ran on a different day.
Every metadata field is bound to a <KeyRelease> event that calls _update_log(). This means the real-time preview panel (the CTkTextbox log at the bottom of the window) refreshes instantly as you type — you can see exactly how your metadata will appear in the report without leaving the form.

Build docs developers (and LLMs) love