|
6 | 6 | import org.junit.jupiter.params.ParameterizedTest; |
7 | 7 | import org.junit.jupiter.params.provider.Arguments; |
8 | 8 | import org.junit.jupiter.params.provider.MethodSource; |
| 9 | +import pl.akmf.ksef.sdk.api.builders.permission.entity.GrantEntityPermissionsRequestBuilder; |
9 | 10 | import pl.akmf.ksef.sdk.api.builders.permission.person.GrantPersonPermissionsRequestBuilder; |
10 | 11 | import pl.akmf.ksef.sdk.api.builders.permission.person.PersonPermissionsQueryRequestBuilder; |
11 | 12 | import pl.akmf.ksef.sdk.api.builders.permission.proxy.GrantAuthorizationPermissionsRequestBuilder; |
| 13 | +import pl.akmf.ksef.sdk.api.builders.permission.subunit.SubunitPermissionsGrantRequestBuilder; |
12 | 14 | import pl.akmf.ksef.sdk.client.model.ApiException; |
13 | 15 | import pl.akmf.ksef.sdk.client.model.certificate.SelfSignedCertificate; |
14 | 16 | import pl.akmf.ksef.sdk.client.model.permission.OperationResponse; |
15 | 17 | import pl.akmf.ksef.sdk.client.model.permission.PermissionStatusInfo; |
| 18 | +import pl.akmf.ksef.sdk.client.model.permission.entity.EntityPermission; |
| 19 | +import pl.akmf.ksef.sdk.client.model.permission.entity.EntityPermissionType; |
| 20 | +import pl.akmf.ksef.sdk.client.model.permission.entity.GrantEntityPermissionsRequest; |
16 | 21 | import pl.akmf.ksef.sdk.client.model.permission.person.GrantPersonPermissionsRequest; |
17 | 22 | import pl.akmf.ksef.sdk.client.model.permission.person.PersonPermissionPersonByFingerprintWithId; |
18 | 23 | import pl.akmf.ksef.sdk.client.model.permission.person.PersonPermissionPersonById; |
|
35 | 40 | import pl.akmf.ksef.sdk.client.model.permission.search.QueryPersonalGrantRequest; |
36 | 41 | import pl.akmf.ksef.sdk.client.model.permission.search.QueryPersonalGrantResponse; |
37 | 42 | import pl.akmf.ksef.sdk.client.model.permission.search.QueryPersonalGrantTargetIdentifier; |
| 43 | +import pl.akmf.ksef.sdk.client.model.permission.search.QueryPersonalPermissionTypes; |
| 44 | +import pl.akmf.ksef.sdk.client.model.permission.subunit.ContextIdentifier; |
| 45 | +import pl.akmf.ksef.sdk.client.model.permission.subunit.PermissionsSubunitPersonByIdentifier; |
| 46 | +import pl.akmf.ksef.sdk.client.model.permission.subunit.PermissionsSubunitSubjectDetailsType; |
| 47 | +import pl.akmf.ksef.sdk.client.model.permission.subunit.SubunitPermissionsGrantRequest; |
| 48 | +import pl.akmf.ksef.sdk.client.model.permission.subunit.SubunitSubjectDetails; |
38 | 49 | import pl.akmf.ksef.sdk.client.model.testdata.SubjectTypeTestData; |
| 50 | +import pl.akmf.ksef.sdk.client.model.testdata.Subunit; |
39 | 51 | import pl.akmf.ksef.sdk.client.model.testdata.TestDataPersonCreateRequest; |
40 | 52 | import pl.akmf.ksef.sdk.client.model.testdata.TestDataSubjectCreateRequest; |
| 53 | +import pl.akmf.ksef.sdk.client.model.testdata.TestDataSubjectRemoveRequest; |
41 | 54 | import pl.akmf.ksef.sdk.configuration.BaseIntegrationTest; |
42 | 55 | import pl.akmf.ksef.sdk.util.IdentifierGeneratorUtils; |
43 | 56 |
|
@@ -420,6 +433,107 @@ void searchGrantedAsOwnerNipFilterByAuthorizedPeselShouldReturnMatch() throws JA |
420 | 433 | ); |
421 | 434 | } |
422 | 435 |
|
| 436 | + |
| 437 | + // Scenariusz E2E weryfikujący: |
| 438 | + // - poprawkę w API zwracającą w liście uprawnień (POST /v2/permissions/query/personal/grants) |
| 439 | + // również uprawnienia podmiotowe InvoiceRead/InvoiceWrite nadane z canDelegate=false, |
| 440 | + // - filtrowanie wyników po InternalId, |
| 441 | + // - dopuszczalną długość identyfikatora InternalId (16 znaków). |
| 442 | + // |
| 443 | + // Kroki: |
| 444 | + // 1. Utworzenie podmiotu głównego (VatGroup) z jednostką podrzędną |
| 445 | + // 2. Nadanie dyrektorowi (PESEL) uprawnień administracyjnych do jednostki podrzędnej w kontekście InternalId |
| 446 | + // 3. Uwierzytelnienie dyrektora w kontekście InternalId |
| 447 | + // 4. Nadanie dyrektorowi uprawnień osobistych InvoiceRead/InvoiceWrite w kontekście InternalId |
| 448 | + // 5. Nadanie w tym samym kontekście uprawnień podmiotowych InvoiceRead/InvoiceWrite z canDelegate=false |
| 449 | + // 6. Weryfikacja listy uprawnień bez filtra (powinny zawierać InvoiceRead/InvoiceWrite z CanDelegate=false) |
| 450 | + // 7. Weryfikacja listy uprawnień z filtrem InternalId (powinny zawierać InvoiceRead/InvoiceWrite z CanDelegate=false) |
| 451 | + // 8. Sprzątanie danych testowych |
| 452 | + @Test |
| 453 | + void personalPermissionsWithInternalIdFilterShouldReturnPermissions() throws ApiException, JAXBException, IOException { |
| 454 | + // Przygotowanie danych |
| 455 | + String municipalOfficeNip = IdentifierGeneratorUtils.generateRandomNIP(); |
| 456 | + String subunitNip = IdentifierGeneratorUtils.generateRandomNIP(); |
| 457 | + String kindergartenId = IdentifierGeneratorUtils.generateInternalIdentifier(municipalOfficeNip); |
| 458 | + String directorPesel = IdentifierGeneratorUtils.getRandomPesel(); |
| 459 | + |
| 460 | + // Weryfikacja kontraktu: InternalId ma długość 16 |
| 461 | + Assertions.assertEquals(16, kindergartenId.length()); |
| 462 | + |
| 463 | + // Utworzenie podmiotu głównego z jednostką podrzędną |
| 464 | + createVatGroupWithSubunit(municipalOfficeNip, subunitNip, "Przedszkole testowe", "Gmina testowa"); |
| 465 | + |
| 466 | + // 1) Uwierzytelnienie jako podmiot główny (właściciel kontekstu) |
| 467 | + String municipalOfficeAuthToken = authWithCustomNip(municipalOfficeNip, municipalOfficeNip).accessToken(); |
| 468 | + |
| 469 | + // 2) Nadanie dyrektorowi uprawnień administracyjnych do jednostki podrzędnej w kontekście InternalId |
| 470 | + String operationGrantNumber = grantPermissionSubunit(directorPesel, kindergartenId, "Przedszkole Testowe", "Sub-unit permission grant", municipalOfficeAuthToken); |
| 471 | + |
| 472 | + await().pollDelay(Duration.ZERO) |
| 473 | + .atMost(15, SECONDS) |
| 474 | + .pollInterval(1, SECONDS) |
| 475 | + .until(() -> isOperationFinish(operationGrantNumber, municipalOfficeAuthToken)); |
| 476 | + |
| 477 | + // 3) Uwierzytelnienie dyrektora w kontekście InternalId |
| 478 | + String kindergartenAuthToken = authAsInternalId(kindergartenId, directorPesel).accessToken(); |
| 479 | + |
| 480 | + // 4) Nadanie uprawnień osobistych InvoiceRead/InvoiceWrite w kontekście InternalId |
| 481 | + String grantPersonReferenceNumber = grantPersonPermission(directorPesel, "Nadanie InvoiceRead i InvoiceWrite dyrektorowi w kontekście InternalId", kindergartenAuthToken); |
| 482 | + |
| 483 | + await().pollDelay(Duration.ZERO) |
| 484 | + .atMost(15, SECONDS) |
| 485 | + .pollInterval(1, SECONDS) |
| 486 | + .until(() -> isOperationFinish(grantPersonReferenceNumber, kindergartenAuthToken)); |
| 487 | + |
| 488 | + // 5) Nadanie uprawnień podmiotowych (entity) InvoiceRead/InvoiceWrite z canDelegate=false |
| 489 | + String grantEntityReferenceNumber = grantPermissionEntity(municipalOfficeNip, |
| 490 | + "Uprawnienia podmiotowe InvoiceRead/InvoiceWrite bez delegowania", |
| 491 | + "Podmiot " + municipalOfficeNip, |
| 492 | + kindergartenAuthToken); |
| 493 | + |
| 494 | + await().pollDelay(Duration.ZERO) |
| 495 | + .atMost(30, SECONDS) |
| 496 | + .pollInterval(2, SECONDS) |
| 497 | + .until(() -> isOperationFinish(grantEntityReferenceNumber, kindergartenAuthToken)); |
| 498 | + |
| 499 | + // 6) Weryfikacja listy uprawnień bez filtra |
| 500 | + QueryPersonalGrantRequest queryWithoutFilter = new QueryPersonalGrantRequest(); |
| 501 | + QueryPersonalGrantResponse personalPermissions = ksefClient.searchPersonalGrantPermission(queryWithoutFilter, 0, 50, kindergartenAuthToken); |
| 502 | + |
| 503 | + // Uprawnienia InvoiceRead/InvoiceWrite powinny być zwrócone również wtedy, gdy canDelegate=false |
| 504 | + Assertions.assertTrue(personalPermissions.getPermissions().stream() |
| 505 | + .anyMatch(p -> QueryPersonalPermissionTypes.INVOICE_READ.equals(p.getPermissionScope()) && p.getCanDelegate() == false) |
| 506 | + ); |
| 507 | + Assertions.assertTrue(personalPermissions.getPermissions().stream() |
| 508 | + .anyMatch(p -> QueryPersonalPermissionTypes.INVOICE_WRITE.equals(p.getPermissionScope()) && p.getCanDelegate() == false) |
| 509 | + ); |
| 510 | + |
| 511 | + // 7) Weryfikacja listy uprawnień z filtrem ContextIdentifier=InternalId |
| 512 | + QueryPersonalGrantRequest request = new QueryPersonalGrantRequest(); |
| 513 | + request.setContextIdentifier(new QueryPersonalGrantContextIdentifier(QueryPersonalGrantContextIdentifier.IdentifierType.INTERNAL_ID, kindergartenId)); |
| 514 | + QueryPersonalGrantResponse permissionsWithInternalIdFilter = ksefClient.searchPersonalGrantPermission(request, 0, 50, kindergartenAuthToken); |
| 515 | + |
| 516 | + Assertions.assertTrue(permissionsWithInternalIdFilter.getPermissions().stream() |
| 517 | + .anyMatch(p -> QueryPersonalPermissionTypes.INVOICE_READ.equals(p.getPermissionScope()) && p.getCanDelegate() == false) |
| 518 | + ); |
| 519 | + Assertions.assertTrue(permissionsWithInternalIdFilter.getPermissions().stream() |
| 520 | + .anyMatch(p -> QueryPersonalPermissionTypes.INVOICE_WRITE.equals(p.getPermissionScope()) && p.getCanDelegate() == false) |
| 521 | + ); |
| 522 | + |
| 523 | + // 8) Sprzątanie danych testowych |
| 524 | + ksefClient.removeTestSubject(new TestDataSubjectRemoveRequest(municipalOfficeNip)); |
| 525 | + } |
| 526 | + |
| 527 | + private void createVatGroupWithSubunit(String vatGroupNip, String subunitNip, String subunitDescription, String description) throws ApiException { |
| 528 | + TestDataSubjectCreateRequest request = new TestDataSubjectCreateRequest(); |
| 529 | + request.setSubjectNip(vatGroupNip); |
| 530 | + request.setSubjectType(SubjectTypeTestData.VAT_GROUP); |
| 531 | + request.setSubunits(List.of(new Subunit(subunitNip, subunitDescription))); |
| 532 | + request.setDescription(description); |
| 533 | + |
| 534 | + ksefClient.createTestSubject(request); |
| 535 | + } |
| 536 | + |
423 | 537 | private void createEnforcementSubject(String nip, String description) throws ApiException { |
424 | 538 | TestDataSubjectCreateRequest request = new TestDataSubjectCreateRequest(); |
425 | 539 | request.setSubjectNip(nip); |
@@ -537,4 +651,46 @@ private Boolean isOperationFinish(String referenceNumber, String accessToken) th |
537 | 651 | PermissionStatusInfo operations = ksefClient.permissionOperationStatus(referenceNumber, accessToken); |
538 | 652 | return operations != null && operations.getStatus().getCode() == 200; |
539 | 653 | } |
| 654 | + |
| 655 | + private String grantPermissionSubunit(String pesel, String contextIdentifierValue, String subunitName, String subunitDescription, String accessToken) throws ApiException { |
| 656 | + SubunitPermissionsGrantRequest request = new SubunitPermissionsGrantRequestBuilder() |
| 657 | + .withSubjectIdentifier(new pl.akmf.ksef.sdk.client.model.permission.subunit.SubjectIdentifier(pl.akmf.ksef.sdk.client.model.permission.subunit.SubjectIdentifier.IdentifierType.PESEL, pesel)) |
| 658 | + .withContextIdentifier(new ContextIdentifier(ContextIdentifier.IdentifierType.INTERNALID, contextIdentifierValue)) |
| 659 | + .withDescription(subunitDescription) |
| 660 | + .withSubunitName(subunitName) |
| 661 | + .withSubjectDetails( |
| 662 | + new SubunitSubjectDetails(PermissionsSubunitSubjectDetailsType.PersonByIdentifier, |
| 663 | + new PermissionsSubunitPersonByIdentifier("Jan", "Kowalski"), |
| 664 | + null, |
| 665 | + null |
| 666 | + ) |
| 667 | + ) |
| 668 | + .build(); |
| 669 | + |
| 670 | + return grantPermissionSubunit(request, accessToken); |
| 671 | + } |
| 672 | + |
| 673 | + private String grantPermissionSubunit(SubunitPermissionsGrantRequest request, String accessToken) throws ApiException { |
| 674 | + OperationResponse response = ksefClient.grantsPermissionSubUnit(request, accessToken); |
| 675 | + Assertions.assertNotNull(response); |
| 676 | + return response.getReferenceNumber(); |
| 677 | + } |
| 678 | + |
| 679 | + private String grantPermissionEntity(String targetNip, String description, String subjectDetailsFullName, String accessToken) throws ApiException { |
| 680 | + GrantEntityPermissionsRequest request = new GrantEntityPermissionsRequestBuilder() |
| 681 | + .withPermissions(List.of( |
| 682 | + new EntityPermission(EntityPermissionType.INVOICE_READ, false), |
| 683 | + new EntityPermission(EntityPermissionType.INVOICE_WRITE, false))) |
| 684 | + .withDescription(description) |
| 685 | + .withSubjectIdentifier(new pl.akmf.ksef.sdk.client.model.permission.entity.SubjectIdentifier(pl.akmf.ksef.sdk.client.model.permission.entity.SubjectIdentifier.IdentifierType.NIP, targetNip)) |
| 686 | + .withSubjectDetails( |
| 687 | + new GrantEntityPermissionsRequest.PermissionsEntitySubjectDetails(subjectDetailsFullName) |
| 688 | + ) |
| 689 | + .build(); |
| 690 | + |
| 691 | + OperationResponse response = ksefClient.grantsPermissionEntity(request, accessToken); |
| 692 | + Assertions.assertNotNull(response); |
| 693 | + |
| 694 | + return response.getReferenceNumber(); |
| 695 | + } |
540 | 696 | } |
0 commit comments