|
13 | 13 | import io.vertx.junit5.VertxTestContext; |
14 | 14 | import org.junit.jupiter.api.Test; |
15 | 15 | import org.junit.jupiter.params.ParameterizedTest; |
| 16 | +import org.junit.jupiter.params.provider.MethodSource; |
16 | 17 | import org.junit.jupiter.params.provider.ValueSource; |
17 | 18 |
|
18 | 19 | import java.util.ArrayList; |
@@ -584,4 +585,57 @@ void deleteServiceLink_invalidServiceId_returnsError(Vertx vertx, VertxTestConte |
584 | 585 | testContext.completeNow(); |
585 | 586 | }); |
586 | 587 | } |
| 588 | + |
| 589 | + @ParameterizedTest |
| 590 | + @MethodSource("linkIdRegexCases") |
| 591 | + void addServiceLink_linkIdRegex_validation(String linkIdRegex, String linkId, boolean expectSuccess, |
| 592 | + Vertx vertx, VertxTestContext testContext) { |
| 593 | + fakeAuth(Role.MAINTAINER); |
| 594 | + |
| 595 | + setSites(new Site(123, "name1", false)); |
| 596 | + setServices(new Service(1, 123, "name1", Set.of(Role.MAINTAINER), linkIdRegex)); |
| 597 | + |
| 598 | + JsonObject jo = new JsonObject(); |
| 599 | + jo.put("link_id", linkId); |
| 600 | + jo.put("service_id", 1); |
| 601 | + jo.put("site_id", 123); |
| 602 | + jo.put("name", "name1"); |
| 603 | + jo.put("roles", JsonArray.of(Role.MAINTAINER)); |
| 604 | + |
| 605 | + post(vertx, testContext, "api/service_link/add", jo.encode(), response -> { |
| 606 | + if (expectSuccess) { |
| 607 | + assertEquals(200, response.statusCode()); |
| 608 | + ServiceLink expected = new ServiceLink(linkId, 1, 123, "name1", Set.of(Role.MAINTAINER)); |
| 609 | + checkServiceLinkJson(expected, response.bodyAsJsonObject()); |
| 610 | + verify(serviceLinkStoreWriter, times(1)).upload(List.of(expected), null); |
| 611 | + } else { |
| 612 | + assertEquals(400, response.statusCode()); |
| 613 | + String expectedMsg = "link_id " + linkId + " does not match service_id 1 link_id_regex: " + linkIdRegex; |
| 614 | + assertEquals(expectedMsg, response.bodyAsJsonObject().getString("message")); |
| 615 | + verify(serviceLinkStoreWriter, never()).upload(any(), any()); |
| 616 | + } |
| 617 | + |
| 618 | + verify(serviceStoreWriter, never()).upload(null, null); |
| 619 | + testContext.completeNow(); |
| 620 | + }); |
| 621 | + } |
| 622 | + |
| 623 | + private static java.util.stream.Stream<org.junit.jupiter.params.provider.Arguments> linkIdRegexCases() { |
| 624 | + return java.util.stream.Stream.of( |
| 625 | + org.junit.jupiter.params.provider.Arguments.of("link[0-9]+", "invalidLink", false), |
| 626 | + org.junit.jupiter.params.provider.Arguments.of("link[0-9]+", "link42", true), |
| 627 | + org.junit.jupiter.params.provider.Arguments.of("^[A-Z0-9_]{1,256}$", "XY12345", true), // snowflake valid |
| 628 | + org.junit.jupiter.params.provider.Arguments.of("^[A-Z0-9_]{1,256}$", "UID2_ENVIRONMENT", true), // snowflake valid |
| 629 | + org.junit.jupiter.params.provider.Arguments.of("^[A-Z0-9_]{1,256}$", "xy12345", false), // snowflake invalid, lowercase |
| 630 | + org.junit.jupiter.params.provider.Arguments.of("^[A-Z0-9_]{1,256}$", "X", true), // snowflake valid, minimum length |
| 631 | + org.junit.jupiter.params.provider.Arguments.of("^[A-Z0-9_]{1,256}$", "X".repeat(256), true), // snowflake valid, maximum length |
| 632 | + org.junit.jupiter.params.provider.Arguments.of("^[A-Z0-9_]{1,256}$", "X".repeat(257), false), // snowflake invalid, exceeds maximum length |
| 633 | + org.junit.jupiter.params.provider.Arguments.of("^[A-Z0-9_]{1,256}$", " XY12345", false), // snowflake invalid, leading whitespace |
| 634 | + org.junit.jupiter.params.provider.Arguments.of("^[A-Z0-9_]{1,256}$", "XY12345 ", false), // snowflake invalid, trailing whitespace |
| 635 | + org.junit.jupiter.params.provider.Arguments.of("^[A-Z0-9_]{1,256}$", "XY 12345", false), // snowflake invalid, whitespace in the middle |
| 636 | + org.junit.jupiter.params.provider.Arguments.of("^[A-Z0-9_]{1,256}$", "", false), // snowflake invalid, empty |
| 637 | + org.junit.jupiter.params.provider.Arguments.of("^[A-Z0-9_]{1,256}$", " ", false), // snowflake invalid, just whitespace |
| 638 | + org.junit.jupiter.params.provider.Arguments.of("^[A-Z0-9_]{1,256}$", "XY_12345", true) // snowflake valid, used underscore |
| 639 | + ); |
| 640 | + } |
587 | 641 | } |
0 commit comments