scriptgini 1.5.2__tar.gz → 1.5.3__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.
- {scriptgini-1.5.2 → scriptgini-1.5.3}/PKG-INFO +2 -2
- {scriptgini-1.5.2 → scriptgini-1.5.3}/README.md +1 -1
- scriptgini-1.5.3/app/__init__.py +3 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/api_key.py +2 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/pyproject.toml +1 -1
- {scriptgini-1.5.2 → scriptgini-1.5.3}/scriptgini.egg-info/PKG-INFO +2 -2
- {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_auth.py +50 -0
- scriptgini-1.5.2/app/__init__.py +0 -3
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/agents/__init__.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/agents/prompts.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/agents/script_gini_agent.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/cache.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/celery_app.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/config.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/database.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/llm/__init__.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/llm/provider.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/main.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/__init__.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/api_key.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/bulk_job.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/execution_job.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/generated_script.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/membership.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/organization.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/project.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/script_revision.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/script_run.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/test_case.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/user.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/__init__.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/analytics.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/auth.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/bulk_jobs.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/demo.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/execution.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/organizations.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/projects.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/reports.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/scripts.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/test_cases.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/__init__.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/analytics.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/api_key.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/auth.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/bulk_job.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/execution.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/generated_script.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/membership.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/organization.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/project.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/reports.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/script_revision.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/test_case.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/services/api_key.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/services/auth.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/services/auth_dependencies.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/services/git_export.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/services/rbac.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/app/tasks.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/scriptgini.egg-info/SOURCES.txt +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/scriptgini.egg-info/dependency_links.txt +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/scriptgini.egg-info/top_level.txt +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/setup.cfg +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_api.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_coverage.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_infra_services_coverage.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_sprint2_rbac.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_sprint3_execution.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_sprint5_reporting_analytics.py +0 -0
- {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_sprint6_coverage_lifecycle.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scriptgini
|
|
3
|
-
Version: 1.5.
|
|
3
|
+
Version: 1.5.3
|
|
4
4
|
Summary: Agentic AI system that converts functional test cases into automation test scripts.
|
|
5
5
|
Author: ScriptGini Team
|
|
6
6
|
License: Proprietary
|
|
@@ -16,7 +16,7 @@ Description-Content-Type: text/markdown
|
|
|
16
16
|
|
|
17
17
|
> **Enterprise-grade Agentic AI system that converts functional test cases into high-quality, review-ready automation test scripts.**
|
|
18
18
|
|
|
19
|
-
Current release: v1.5.
|
|
19
|
+
Current release: v1.5.3 (Sprint 6 complete - 100% test coverage and full audit logging hardening)
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **Enterprise-grade Agentic AI system that converts functional test cases into high-quality, review-ready automation test scripts.**
|
|
4
4
|
|
|
5
|
-
Current release: v1.5.
|
|
5
|
+
Current release: v1.5.3 (Sprint 6 complete - 100% test coverage and full audit logging hardening)
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -118,6 +118,7 @@ def update_api_key(
|
|
|
118
118
|
|
|
119
119
|
# Check that the key belongs to the current user
|
|
120
120
|
if existing_key.user_id != current_user.id:
|
|
121
|
+
_audit_api_key_event("api_key_revoked", current_user.id, existing_key.id, existing_key.prefix, "forbidden")
|
|
121
122
|
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Not authorized to update this API key")
|
|
122
123
|
|
|
123
124
|
api_key = api_key_service.update_api_key(
|
|
@@ -141,6 +142,7 @@ def delete_api_key(
|
|
|
141
142
|
existing_key = api_key_service.get_api_key_by_id(db, key_id)
|
|
142
143
|
|
|
143
144
|
if not existing_key:
|
|
145
|
+
_audit_api_key_event("api_key_revoked", current_user.id, key_id, None, "not_found")
|
|
144
146
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="API key not found")
|
|
145
147
|
|
|
146
148
|
# Check that the key belongs to the current user
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "scriptgini"
|
|
7
|
-
version = "1.5.
|
|
7
|
+
version = "1.5.3"
|
|
8
8
|
description = "Agentic AI system that converts functional test cases into automation test scripts."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scriptgini
|
|
3
|
-
Version: 1.5.
|
|
3
|
+
Version: 1.5.3
|
|
4
4
|
Summary: Agentic AI system that converts functional test cases into automation test scripts.
|
|
5
5
|
Author: ScriptGini Team
|
|
6
6
|
License: Proprietary
|
|
@@ -16,7 +16,7 @@ Description-Content-Type: text/markdown
|
|
|
16
16
|
|
|
17
17
|
> **Enterprise-grade Agentic AI system that converts functional test cases into high-quality, review-ready automation test scripts.**
|
|
18
18
|
|
|
19
|
-
Current release: v1.5.
|
|
19
|
+
Current release: v1.5.3 (Sprint 6 complete - 100% test coverage and full audit logging hardening)
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
@@ -386,6 +386,43 @@ class TestAPIKeyManagement:
|
|
|
386
386
|
)
|
|
387
387
|
assert response.status_code == 403
|
|
388
388
|
|
|
389
|
+
def test_update_api_key_not_accessible_by_other_user_emits_audit_log(
|
|
390
|
+
self, db_session, test_user, test_user_2, auth_headers, monkeypatch
|
|
391
|
+
):
|
|
392
|
+
"""Update by non-owner should emit a structured audit event."""
|
|
393
|
+
create_response = client.post(
|
|
394
|
+
"/api/v1/auth/api-keys",
|
|
395
|
+
headers=auth_headers,
|
|
396
|
+
json={"name": "Owner Key", "scopes": ["read"]},
|
|
397
|
+
)
|
|
398
|
+
key_id = create_response.json()["id"]
|
|
399
|
+
|
|
400
|
+
login_response = client.post(
|
|
401
|
+
"/api/v1/auth/login",
|
|
402
|
+
json={
|
|
403
|
+
"email": "testuser2@example.com",
|
|
404
|
+
"password": "TestPassword123!",
|
|
405
|
+
},
|
|
406
|
+
)
|
|
407
|
+
other_user_headers = {
|
|
408
|
+
"Authorization": f"Bearer {login_response.json()['access_token']}"
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
captured: list[tuple] = []
|
|
412
|
+
|
|
413
|
+
def _capture_log(*args, **kwargs):
|
|
414
|
+
captured.append(args)
|
|
415
|
+
|
|
416
|
+
monkeypatch.setattr("app.routers.api_key.logger.info", _capture_log)
|
|
417
|
+
|
|
418
|
+
response = client.put(
|
|
419
|
+
f"/api/v1/auth/api-keys/{key_id}",
|
|
420
|
+
headers=other_user_headers,
|
|
421
|
+
json={"name": "Hacked", "scopes": ["write"]},
|
|
422
|
+
)
|
|
423
|
+
assert response.status_code == 403
|
|
424
|
+
assert any(len(entry) > 5 and entry[1] == "api_key_revoked" and entry[5] == "forbidden" for entry in captured)
|
|
425
|
+
|
|
389
426
|
def test_delete_api_key(self, db_session, test_user, auth_headers):
|
|
390
427
|
"""Test deleting an API key."""
|
|
391
428
|
# Create key
|
|
@@ -449,6 +486,19 @@ class TestAPIKeyManagement:
|
|
|
449
486
|
response = client.delete("/api/v1/auth/api-keys/99999", headers=auth_headers)
|
|
450
487
|
assert response.status_code == 404
|
|
451
488
|
|
|
489
|
+
def test_delete_api_key_not_found_emits_audit_log(self, auth_headers, monkeypatch):
|
|
490
|
+
"""Missing API key deletion should emit a structured audit event."""
|
|
491
|
+
captured: list[tuple] = []
|
|
492
|
+
|
|
493
|
+
def _capture_log(*args, **kwargs):
|
|
494
|
+
captured.append(args)
|
|
495
|
+
|
|
496
|
+
monkeypatch.setattr("app.routers.api_key.logger.info", _capture_log)
|
|
497
|
+
|
|
498
|
+
response = client.delete("/api/v1/auth/api-keys/99999", headers=auth_headers)
|
|
499
|
+
assert response.status_code == 404
|
|
500
|
+
assert any(len(entry) > 5 and entry[1] == "api_key_revoked" and entry[5] == "not_found" for entry in captured)
|
|
501
|
+
|
|
452
502
|
def test_delete_api_key_not_accessible_by_other_user(
|
|
453
503
|
self, db_session, test_user, test_user_2, auth_headers
|
|
454
504
|
):
|
scriptgini-1.5.2/app/__init__.py
DELETED
|
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
|
|
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
|