|
20 | 20 |
|
21 | 21 | import pytest |
22 | 22 |
|
23 | | -from etos_api.library.validator import SuiteValidator, ValidationError |
| 23 | +from etos_api.library.validator import ( |
| 24 | + ArtifactValidator, |
| 25 | + SuiteValidator, |
| 26 | + ValidationError, |
| 27 | +) |
24 | 28 |
|
25 | 29 | logging.basicConfig(level=logging.DEBUG, stream=sys.stdout) |
26 | 30 |
|
@@ -356,3 +360,171 @@ async def test_validate_empty_constraints(self): |
356 | 360 | self.logger.info("STEP: Validate a suite without the required key.") |
357 | 361 | with pytest.raises(ValidationError): |
358 | 362 | await validator.validate([base_suite]) |
| 363 | + |
| 364 | + |
| 365 | +class TestArtifactValidator: |
| 366 | + """Test the artifact validation functions.""" |
| 367 | + |
| 368 | + def setup_method(self): |
| 369 | + """Set up test fixtures.""" |
| 370 | + self.validator = ArtifactValidator() |
| 371 | + |
| 372 | + def test_validate_purl_valid(self): |
| 373 | + """Test that valid PURL strings are accepted.""" |
| 374 | + valid_purls = [ |
| 375 | + "pkg:npm/lodash@4.17.21", |
| 376 | + "pkg:pypi/requests@2.25.1", |
| 377 | + "pkg:maven/org.apache.commons/commons-lang3@3.12.0", |
| 378 | + "pkg:golang/github.com/gorilla/mux@v1.8.0", |
| 379 | + "pkg:docker/nginx@latest", |
| 380 | + "pkg:generic/openssl@1.1.1k", |
| 381 | + ] |
| 382 | + |
| 383 | + for purl in valid_purls: |
| 384 | + assert self.validator.validate_purl(purl) is True |
| 385 | + |
| 386 | + def test_validate_purl_invalid(self): |
| 387 | + """Test that invalid PURL strings are rejected.""" |
| 388 | + invalid_purls = [ |
| 389 | + "", |
| 390 | + None, |
| 391 | + "not-a-purl", |
| 392 | + "http://example.com", |
| 393 | + "pkg:", # Missing parts |
| 394 | + "pkg:npm/", # Incomplete |
| 395 | + "npm/lodash@4.17.21", # Missing pkg: prefix |
| 396 | + "PKG:npm/lodash@4.17.21", # Wrong case |
| 397 | + ] |
| 398 | + |
| 399 | + for purl in invalid_purls: |
| 400 | + assert self.validator.validate_purl(purl) is False |
| 401 | + |
| 402 | + def test_validate_uuid_valid(self): |
| 403 | + """Test that valid UUID strings are accepted.""" |
| 404 | + valid_uuids = [ |
| 405 | + "550e8400-e29b-41d4-a716-446655440000", |
| 406 | + "6ba7b810-9dad-11d1-80b4-00c04fd430c8", |
| 407 | + "6ba7b811-9dad-11d1-80b4-00c04fd430c8", |
| 408 | + "6ba7b812-9dad-11d1-80b4-00c04fd430c8", |
| 409 | + "6ba7b814-9dad-11d1-80b4-00c04fd430c8", |
| 410 | + "f47ac10b-58cc-4372-a567-0e02b2c3d479", |
| 411 | + ] |
| 412 | + |
| 413 | + for uuid_str in valid_uuids: |
| 414 | + assert self.validator.validate_uuid(uuid_str) is True |
| 415 | + |
| 416 | + def test_validate_uuid_invalid(self): |
| 417 | + """Test that invalid UUID strings are rejected.""" |
| 418 | + invalid_uuids = [ |
| 419 | + "", |
| 420 | + None, |
| 421 | + "not-a-uuid", |
| 422 | + "550e8400-e29b-41d4-a716", # Too short |
| 423 | + "550e8400-e29b-41d4-a716-446655440000-extra", # Too long |
| 424 | + "550e8400-e29b-41d4-a716-44665544000g", # Invalid character (g) |
| 425 | + ] |
| 426 | + |
| 427 | + for uuid_str in invalid_uuids: |
| 428 | + assert self.validator.validate_uuid(uuid_str) is False |
| 429 | + |
| 430 | + def test_validate_artifact_identity_or_id_valid_purl(self): |
| 431 | + """Test validation with valid PURL artifact_identity.""" |
| 432 | + # Should not raise any exception |
| 433 | + self.validator.validate_artifact_identity_or_id( |
| 434 | + artifact_identity="pkg:npm/lodash@4.17.21", artifact_id=None |
| 435 | + ) |
| 436 | + |
| 437 | + def test_validate_artifact_identity_or_id_valid_uuid(self): |
| 438 | + """Test validation with valid UUID artifact_id.""" |
| 439 | + # Should not raise any exception |
| 440 | + self.validator.validate_artifact_identity_or_id( |
| 441 | + artifact_identity=None, artifact_id="550e8400-e29b-41d4-a716-446655440000" |
| 442 | + ) |
| 443 | + |
| 444 | + def test_validate_artifact_identity_or_id_invalid_purl(self): |
| 445 | + """Test validation with invalid PURL artifact_identity raises ValueError.""" |
| 446 | + with pytest.raises(ValueError) as exc_info: |
| 447 | + self.validator.validate_artifact_identity_or_id( |
| 448 | + artifact_identity="not-a-purl", artifact_id=None |
| 449 | + ) |
| 450 | + assert "Invalid artifact_identity" in str(exc_info.value) |
| 451 | + assert "is not a valid PURL" in str(exc_info.value) |
| 452 | + |
| 453 | + def test_validate_artifact_identity_or_id_invalid_uuid(self): |
| 454 | + """Test validation with invalid UUID artifact_id raises ValueError.""" |
| 455 | + with pytest.raises(ValueError) as exc_info: |
| 456 | + self.validator.validate_artifact_identity_or_id( |
| 457 | + artifact_identity=None, artifact_id="not-a-uuid" |
| 458 | + ) |
| 459 | + assert "Invalid artifact_id" in str(exc_info.value) |
| 460 | + assert "is not a valid UUID" in str(exc_info.value) |
| 461 | + |
| 462 | + def test_validate_artifact_identity_or_id_both_provided(self): |
| 463 | + """Test validation with both valid values provided.""" |
| 464 | + # Should not raise any exception when both are valid |
| 465 | + self.validator.validate_artifact_identity_or_id( |
| 466 | + artifact_identity="pkg:npm/lodash@4.17.21", |
| 467 | + artifact_id="550e8400-e29b-41d4-a716-446655440000", |
| 468 | + ) |
| 469 | + |
| 470 | + def test_validate_artifact_identity_or_id_neither_provided(self): |
| 471 | + """Test validation with neither value provided.""" |
| 472 | + # Should not raise any exception - no validation is performed when both are None |
| 473 | + self.validator.validate_artifact_identity_or_id(artifact_identity=None, artifact_id=None) |
| 474 | + |
| 475 | + # Tests for ArtifactValidator class methods (should raise ValueError) |
| 476 | + def test_artifact_validator_validate_purl_valid(self): |
| 477 | + """Test ArtifactValidator.validate_purl with valid PURL strings.""" |
| 478 | + valid_purls = [ |
| 479 | + "pkg:npm/lodash@4.17.21", |
| 480 | + "pkg:pypi/requests@2.25.1", |
| 481 | + "pkg:maven/org.apache.commons/commons-lang3@3.12.0", |
| 482 | + ] |
| 483 | + |
| 484 | + for purl in valid_purls: |
| 485 | + assert self.validator.validate_purl(purl) is True |
| 486 | + |
| 487 | + def test_artifact_validator_validate_uuid_valid(self): |
| 488 | + """Test ArtifactValidator.validate_uuid with valid UUID strings.""" |
| 489 | + valid_uuids = [ |
| 490 | + "550e8400-e29b-41d4-a716-446655440000", |
| 491 | + "6ba7b810-9dad-11d1-80b4-00c04fd430c8", |
| 492 | + ] |
| 493 | + |
| 494 | + for uuid_str in valid_uuids: |
| 495 | + assert self.validator.validate_uuid(uuid_str) is True |
| 496 | + |
| 497 | + def test_artifact_validator_validate_artifact_identity_or_id_valid(self): |
| 498 | + """Test ArtifactValidator.validate_artifact_identity_or_id with valid inputs.""" |
| 499 | + # Should not raise any exception |
| 500 | + self.validator.validate_artifact_identity_or_id( |
| 501 | + artifact_identity="pkg:npm/lodash@4.17.21", artifact_id=None |
| 502 | + ) |
| 503 | + |
| 504 | + self.validator.validate_artifact_identity_or_id( |
| 505 | + artifact_identity=None, artifact_id="550e8400-e29b-41d4-a716-446655440000" |
| 506 | + ) |
| 507 | + |
| 508 | + def test_artifact_validator_validate_identity_or_id_invalid_purl(self): |
| 509 | + """Test ArtifactValidator.validate_artifact_identity_or_id with invalid PURL. |
| 510 | +
|
| 511 | + Should raise ValueError. |
| 512 | + """ |
| 513 | + with pytest.raises(ValueError) as exc_info: |
| 514 | + self.validator.validate_artifact_identity_or_id( |
| 515 | + artifact_identity="not-a-purl", artifact_id=None |
| 516 | + ) |
| 517 | + assert "Invalid artifact_identity" in str(exc_info.value) |
| 518 | + assert "is not a valid PURL" in str(exc_info.value) |
| 519 | + |
| 520 | + def test_artifact_validator_validate_identity_or_id_invalid_uuid(self): |
| 521 | + """Test ArtifactValidator.validate_artifact_identity_or_id with invalid UUID. |
| 522 | +
|
| 523 | + Should raise ValueError. |
| 524 | + """ |
| 525 | + with pytest.raises(ValueError) as exc_info: |
| 526 | + self.validator.validate_artifact_identity_or_id( |
| 527 | + artifact_identity=None, artifact_id="not-a-uuid" |
| 528 | + ) |
| 529 | + assert "Invalid artifact_id" in str(exc_info.value) |
| 530 | + assert "is not a valid UUID" in str(exc_info.value) |
0 commit comments