qapytest 0.3.4__tar.gz → 0.3.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {qapytest-0.3.4 → qapytest-0.3.6}/CHANGELOG.md +18 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/PKG-INFO +1 -1
- {qapytest-0.3.4 → qapytest-0.3.6}/pyproject.toml +1 -1
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_assets/scripts.js +31 -20
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_assets/styles.css +7 -2
- {qapytest-0.3.4 → qapytest-0.3.6}/uv.lock +1 -1
- {qapytest-0.3.4 → qapytest-0.3.6}/.gitignore +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/.pre-commit-config.yaml +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/LICENSE +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/NOTICE +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/README.md +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/THIRD_PARTY_NOTICES.txt +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/demo.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/docs/API.md +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/docs/CLI.md +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/licenses/faker.LICENSE +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/licenses/httpx.LICENSE +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/licenses/jinja2.LICENSE +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/licenses/jsonschema.LICENSE +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/licenses/playwright-python.LICENSE +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/licenses/pytest-playwright.LICENSE +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/licenses/pytest.LICENSE +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/licenses/python_dotenv.LICENSE +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/licenses/redis-py.LICENSE +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/licenses/sqlalchemy.LICENSE +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/__init__.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_assets/_log_tree.html.jinja2 +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_assets/report.html.jinja2 +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_attach.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_client_http.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_config.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_config_http.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_internal.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_json_validation.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_plugin.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_redis.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_report.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_soft_assert.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_sql.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/_step.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/qapytest/py.typed +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/tests/encoding.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_attach.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_graphql_client.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_http_client.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_integration.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_internal_functions.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_markers.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_redis_client.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_soft_assert.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_sql_client.py +0 -0
- {qapytest-0.3.4 → qapytest-0.3.6}/tests/test_step.py +0 -0
|
@@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.3.6] - 2025-11-24
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- 📊 **HTML Report Layout** - improved the "Component" column display:
|
|
13
|
+
- Components are now listed on separate lines for better readability
|
|
14
|
+
- Long component names wrap correctly instead of overflowing
|
|
15
|
+
- Column width is now flexible and adapts to screen size
|
|
16
|
+
- 🔍 **Component Filter** - fixed the filter menu position to prevent it from going off-screen on smaller displays
|
|
17
|
+
|
|
18
|
+
## [0.3.5] - 2025-11-23
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- 📋 **Report Copying** - improved the "Copy" functionality in test details to produce clean, readable text without excessive indentation or duplicated content.
|
|
23
|
+
|
|
8
24
|
## [0.3.4] - 2025-11-23
|
|
9
25
|
|
|
10
26
|
### Enhanced
|
|
@@ -169,6 +185,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
169
185
|
- Configurable attachment size limits
|
|
170
186
|
- Professional report styling with responsive design
|
|
171
187
|
|
|
188
|
+
[0.3.6]: https://github.com/o73k51i/qapytest/releases/tag/v0.3.6
|
|
189
|
+
[0.3.5]: https://github.com/o73k51i/qapytest/releases/tag/v0.3.5
|
|
172
190
|
[0.3.4]: https://github.com/o73k51i/qapytest/releases/tag/v0.3.4
|
|
173
191
|
[0.3.3]: https://github.com/o73k51i/qapytest/releases/tag/v0.3.3
|
|
174
192
|
[0.3.2]: https://github.com/o73k51i/qapytest/releases/tag/v0.3.2
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: qapytest
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.6
|
|
4
4
|
Summary: A powerful testing framework based on pytest, specifically designed for QA engineers
|
|
5
5
|
Project-URL: Homepage, https://github.com/o73k51i/qapytest
|
|
6
6
|
Project-URL: Repository, https://github.com/o73k51i/qapytest
|
|
@@ -359,7 +359,11 @@
|
|
|
359
359
|
|
|
360
360
|
if (!key || !value) continue;
|
|
361
361
|
|
|
362
|
-
const
|
|
362
|
+
const keyClone = key.cloneNode(true);
|
|
363
|
+
const keyButtons = keyClone.querySelectorAll('button, .details-btn, div');
|
|
364
|
+
keyButtons.forEach(el => el.remove());
|
|
365
|
+
const keyText = keyClone.textContent.trim();
|
|
366
|
+
|
|
363
367
|
const valueElement = value;
|
|
364
368
|
|
|
365
369
|
if (keyText === 'Execution Log') {
|
|
@@ -387,13 +391,9 @@
|
|
|
387
391
|
const lines = [];
|
|
388
392
|
|
|
389
393
|
function processLogItems(container, indent = '') {
|
|
390
|
-
const items =
|
|
394
|
+
const items = Array.from(container.children).filter(el => el.tagName === 'LI');
|
|
395
|
+
|
|
391
396
|
items.forEach(item => {
|
|
392
|
-
const parentUl = item.parentElement;
|
|
393
|
-
if (parentUl && parentUl !== container && parentUl.closest('li') && parentUl.closest('li').parentElement === container) {
|
|
394
|
-
return;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
397
|
let text = '';
|
|
398
398
|
|
|
399
399
|
if (item.classList.contains('step-passed') || item.classList.contains('step-failed')) {
|
|
@@ -404,10 +404,20 @@
|
|
|
404
404
|
const stepText = strongElement.nextSibling.textContent?.trim() || '';
|
|
405
405
|
text = `${stepIcon} ${stepText}`;
|
|
406
406
|
} else {
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
407
|
+
let directText = '';
|
|
408
|
+
item.childNodes.forEach(node => {
|
|
409
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
410
|
+
directText += node.textContent;
|
|
411
|
+
} else if (node.nodeType === Node.ELEMENT_NODE &&
|
|
412
|
+
!node.classList.contains('step-children') &&
|
|
413
|
+
!node.classList.contains('step-toggle') &&
|
|
414
|
+
!node.classList.contains('step-toggle-placeholder')) {
|
|
415
|
+
directText += node.textContent;
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
const cleaned = directText.replace(/^[✔︎✖︎]\s*Step:\s*/, '').replace(/\s*[✔︎✖︎].*$/, '').trim();
|
|
420
|
+
text = `${stepIcon} ${cleaned}`;
|
|
411
421
|
}
|
|
412
422
|
}
|
|
413
423
|
else if (item.classList.contains('assert-passed') || item.classList.contains('assert-failed')) {
|
|
@@ -416,11 +426,11 @@
|
|
|
416
426
|
|
|
417
427
|
if (assertLabel) {
|
|
418
428
|
let labelText = '';
|
|
419
|
-
|
|
429
|
+
assertLabel.childNodes.forEach(node => {
|
|
420
430
|
if (node.nodeType === Node.TEXT_NODE) {
|
|
421
431
|
labelText += node.textContent;
|
|
422
432
|
}
|
|
423
|
-
}
|
|
433
|
+
});
|
|
424
434
|
labelText = labelText.replace(/^[✔︎✖︎\s]*/, '').trim();
|
|
425
435
|
text = `${assertIcon} ${labelText}`;
|
|
426
436
|
|
|
@@ -442,13 +452,15 @@
|
|
|
442
452
|
}
|
|
443
453
|
}
|
|
444
454
|
}
|
|
455
|
+
} else {
|
|
456
|
+
const attachmentBtn = item.querySelector('button');
|
|
457
|
+
if (attachmentBtn && attachmentBtn.textContent.includes('📎')) {
|
|
458
|
+
text = attachmentBtn.textContent.trim();
|
|
459
|
+
}
|
|
445
460
|
}
|
|
446
461
|
|
|
447
462
|
if (text) {
|
|
448
|
-
|
|
449
|
-
const currentIndentLevel = indent.length / 2;
|
|
450
|
-
const actualIndent = currentIndentLevel <= maxIndentLevel ? indent : ' ';
|
|
451
|
-
lines.push(actualIndent + text);
|
|
463
|
+
lines.push(indent + text);
|
|
452
464
|
}
|
|
453
465
|
|
|
454
466
|
let nestedUl = null;
|
|
@@ -458,13 +470,12 @@
|
|
|
458
470
|
}
|
|
459
471
|
|
|
460
472
|
if (nestedUl) {
|
|
461
|
-
|
|
462
|
-
processLogItems(nestedUl, nextIndent);
|
|
473
|
+
processLogItems(nestedUl, indent + ' ');
|
|
463
474
|
}
|
|
464
475
|
});
|
|
465
476
|
}
|
|
466
477
|
|
|
467
|
-
const topLevelUl =
|
|
478
|
+
const topLevelUl = logContainer.querySelector(':scope > ul');
|
|
468
479
|
if (topLevelUl) {
|
|
469
480
|
processLogItems(topLevelUl);
|
|
470
481
|
}
|
|
@@ -269,9 +269,13 @@ html[data-theme="dark"] .theme-toggle .theme-icon-sun {
|
|
|
269
269
|
|
|
270
270
|
.table th:nth-child(1) { width: 50px; }
|
|
271
271
|
.table th:nth-child(3) { width: 110px; }
|
|
272
|
-
.table th:nth-child(4) { width:
|
|
272
|
+
.table th:nth-child(4) { width: 25%; z-index: 11; }
|
|
273
273
|
.table th:nth-child(5) { width: 130px; }
|
|
274
274
|
|
|
275
|
+
.table td:nth-child(4) {
|
|
276
|
+
overflow-wrap: anywhere;
|
|
277
|
+
}
|
|
278
|
+
|
|
275
279
|
.table {
|
|
276
280
|
width: 100%;
|
|
277
281
|
border-collapse: separate;
|
|
@@ -829,7 +833,8 @@ html[data-theme="dark"] .theme-toggle .theme-icon-sun {
|
|
|
829
833
|
.th-filter-menu {
|
|
830
834
|
position: absolute;
|
|
831
835
|
top: 100%;
|
|
832
|
-
|
|
836
|
+
right: 0;
|
|
837
|
+
left: auto;
|
|
833
838
|
margin-top: 4px;
|
|
834
839
|
background: var(--elev-bg);
|
|
835
840
|
border: 1px solid var(--elev-border-strong);
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|