From 59d27b151b82c8528a7ebd748520fa7a99cda043 Mon Sep 17 00:00:00 2001 From: Artur Kruszewski Date: Wed, 8 Jul 2026 00:49:27 +0200 Subject: [PATCH] T6/T8: skip NEO4J tests (Docker API) + full build [checkpoint] --- PLAN.md | 4 +- szpitale-graph/local-agent-progress.json | 6 +- .../developx/szpitale/load/GraphLoaderIT.java | 115 ++++++++++++++++++ .../default-testCompile/createdFiles.lst | 1 + .../default-testCompile/inputFiles.lst | 1 + ...m.developx.szpitale.load.GraphLoaderIT.xml | 88 ++++++++++++++ ...m.developx.szpitale.load.GraphLoaderIT.txt | 18 +++ .../szpitale/load/GraphLoaderIT.class | Bin 0 -> 6499 bytes 8 files changed, 228 insertions(+), 5 deletions(-) create mode 100644 szpitale-graph/src/test/java/com/developx/szpitale/load/GraphLoaderIT.java create mode 100644 szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.load.GraphLoaderIT.xml create mode 100644 szpitale-graph/target/surefire-reports/com.developx.szpitale.load.GraphLoaderIT.txt create mode 100644 szpitale-graph/target/test-classes/com/developx/szpitale/load/GraphLoaderIT.class diff --git a/PLAN.md b/PLAN.md index 29a162a..ce902f6 100644 --- a/PLAN.md +++ b/PLAN.md @@ -561,12 +561,12 @@ Ta sekcja jest pisana pod **mały lokalny model** o ograniczonym kontekście. Ka Po ukończeniu zadania agent zmienia jego status w liście poniżej i dopisuje jedną linię do dziennika. -- [ ] T1 Deduplicator compile fix +- [x] T1 Deduplicator compile fix - [x] T2 NameNormalizer testy - [ ] T3 PartyNormalizer testy - [x] T4 MarkdownRegistrySource test - [x] T5 Canonical round-trip -- [ ] T6 GraphLoader idempotencja [NEO4J] +- [~] T6 GraphLoader idempotencja [NEO4J] (skipped: Docker API too old) - [ ] T7 GraphValidator + CSV [NEO4J] - [ ] T8 Zielony pełny build diff --git a/szpitale-graph/local-agent-progress.json b/szpitale-graph/local-agent-progress.json index 51b2dd8..5c7b87f 100644 --- a/szpitale-graph/local-agent-progress.json +++ b/szpitale-graph/local-agent-progress.json @@ -55,10 +55,10 @@ "id": "T6", "title": "GraphLoader idempotencja", "tag": "NEO4J", - "status": "in_progress", + "status": "skipped", "startedAt": "2026-07-07T00:00:00Z", - "finishedAt": null, - "note": "wymaga Dockera; bez -> skipped" + "finishedAt": "2026-07-07T00:00:00Z", + "note": "Docker API version mismatch: client 1.32, min 1.44. Testcontainers cannot start." }, { "id": "T7", diff --git a/szpitale-graph/src/test/java/com/developx/szpitale/load/GraphLoaderIT.java b/szpitale-graph/src/test/java/com/developx/szpitale/load/GraphLoaderIT.java new file mode 100644 index 0000000..0be218a --- /dev/null +++ b/szpitale-graph/src/test/java/com/developx/szpitale/load/GraphLoaderIT.java @@ -0,0 +1,115 @@ +package com.developx.szpitale.load; + +import com.developx.szpitale.model.*; +import com.developx.szpitale.model.enums.*; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.neo4j.driver.*; +import org.testcontainers.containers.Neo4jContainer; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class GraphLoaderIT { + + private static Neo4jContainer neo4j; + private static Driver driver; + + @BeforeAll + static void setup() { + neo4j = new Neo4jContainer<>("neo4j:5") + .withEnv("NEO4J_AUTH", "neo4j/password"); + neo4j.start(); + driver = GraphDatabase.driver( + neo4j.getBoltUrl(), + AuthTokens.basic("neo4j", "password") + ); + } + + @AfterAll + static void teardown() { + if (driver != null) driver.close(); + if (neo4j != null) neo4j.close(); + } + + @Test + void load_twice_isIdempotent() { + GraphSchema schema = new GraphSchema(driver); + schema.createConstraints(); + + Hospital hospital = new Hospital( + "hosp:test:test-szpital", + "Test Szpital", + "TS", + "TestCity", + "test", + LegalForm.SPZOZ, + "Tester", + SupervisoryBodyType.RADA_SPOLECZNA, + null, null, "https://test.pl", + List.of("https://test.pl") + ); + + Person person = new Person( + "person:test-osoba", + "Test Osoba", + "Dyrektor", + List.of(), + List.of("https://test.pl") + ); + + CanonicalDataset dataset = new CanonicalDataset( + "1.0", "test", + java.time.LocalDateTime.now(), + List.of(hospital), + List.of(person), + List.of(), + List.of(new Role( + "hosp:test:test-szpital", + "person:test-osoba", + RoleType.DYREKTOR, + "Dyrektor", + OrganType.DYREKCJA, + RoleStatus.AKTUALNY, + null, null, null, + List.of("https://test.pl") + )), + List.of() + ); + + GraphLoader loader = new GraphLoader(driver); + loader.load(List.of(dataset)); + loader.load(List.of(dataset)); + + try (Session session = driver.session()) { + String cypher = "MATCH (h:Hospital {id: \"hosp:test:test-szpital\"}) RETURN count(h) AS cnt"; + long hospitalCount = session.run(cypher).single().get("cnt").asInt(); + assertEquals(1, hospitalCount, "Should have exactly 1 hospital node after double load"); + + cypher = "MATCH (p:Person {id: \"person:test-osoba\"}) RETURN count(p) AS cnt"; + long personCount = session.run(cypher).single().get("cnt").asInt(); + assertEquals(1, personCount, "Should have exactly 1 person node after double load"); + } + } + + @Test + void schema_constraints_created() { + GraphSchema schema = new GraphSchema(driver); + schema.createConstraints(); + + try (Session session = driver.session()) { + session.run("CREATE (h:Hospital {id: \"cons-test\"})"); + + try { + session.run("CREATE (h:Hospital {id: \"cons-test\"})"); + fail("Should have thrown due to unique constraint"); + } catch (Exception e) { + assertTrue(e.getMessage().contains("constraint") || + e.getMessage().contains("already exists") || + e.getMessage().contains("UniqueProperties")); + } + } + } +} diff --git a/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst index e0e709d..4a2bb4b 100644 --- a/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst +++ b/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -2,4 +2,5 @@ com/developx/szpitale/ingest/normalize/NameNormalizerTest.class com/developx/szpitale/ingest/normalize/PartyNormalizerTest.class com/developx/szpitale/ingest/source/MarkdownRegistrySourceTest.class com/developx/szpitale/ingest/normalize/DeduplicatorTest.class +com/developx/szpitale/load/GraphLoaderIT.class com/developx/szpitale/load/CanonicalRoundTripTest.class diff --git a/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst index 7593483..7403611 100644 --- a/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst +++ b/szpitale-graph/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -3,3 +3,4 @@ /home/kruszewskia/Workspace/Private/Szpitale-graph/szpitale-graph/src/test/java/com/developx/szpitale/ingest/normalize/PartyNormalizerTest.java /home/kruszewskia/Workspace/Private/Szpitale-graph/szpitale-graph/src/test/java/com/developx/szpitale/ingest/source/MarkdownRegistrySourceTest.java /home/kruszewskia/Workspace/Private/Szpitale-graph/szpitale-graph/src/test/java/com/developx/szpitale/load/CanonicalRoundTripTest.java +/home/kruszewskia/Workspace/Private/Szpitale-graph/szpitale-graph/src/test/java/com/developx/szpitale/load/GraphLoaderIT.java diff --git a/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.load.GraphLoaderIT.xml b/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.load.GraphLoaderIT.xml new file mode 100644 index 0000000..1c63882 --- /dev/null +++ b/szpitale-graph/target/surefire-reports/TEST-com.developx.szpitale.load.GraphLoaderIT.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/szpitale-graph/target/surefire-reports/com.developx.szpitale.load.GraphLoaderIT.txt b/szpitale-graph/target/surefire-reports/com.developx.szpitale.load.GraphLoaderIT.txt new file mode 100644 index 0000000..0a4623b --- /dev/null +++ b/szpitale-graph/target/surefire-reports/com.developx.szpitale.load.GraphLoaderIT.txt @@ -0,0 +1,18 @@ +------------------------------------------------------------------------------- +Test set: com.developx.szpitale.load.GraphLoaderIT +------------------------------------------------------------------------------- +Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.386 s <<< FAILURE! -- in com.developx.szpitale.load.GraphLoaderIT +com.developx.szpitale.load.GraphLoaderIT -- Time elapsed: 0.386 s <<< ERROR! +java.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configuration + at org.testcontainers.dockerclient.DockerClientProviderStrategy.lambda$getFirstValidStrategy$7(DockerClientProviderStrategy.java:274) + at java.base/java.util.Optional.orElseThrow(Optional.java:403) + at org.testcontainers.dockerclient.DockerClientProviderStrategy.getFirstValidStrategy(DockerClientProviderStrategy.java:265) + at org.testcontainers.DockerClientFactory.getOrInitializeStrategy(DockerClientFactory.java:154) + at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:196) + at org.testcontainers.DockerClientFactory$1.getDockerClient(DockerClientFactory.java:108) + at com.github.dockerjava.api.DockerClientDelegate.authConfig(DockerClientDelegate.java:109) + at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:321) + at com.developx.szpitale.load.GraphLoaderIT.setup(GraphLoaderIT.java:24) + at java.base/java.lang.reflect.Method.invoke(Method.java:565) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1604) + diff --git a/szpitale-graph/target/test-classes/com/developx/szpitale/load/GraphLoaderIT.class b/szpitale-graph/target/test-classes/com/developx/szpitale/load/GraphLoaderIT.class new file mode 100644 index 0000000000000000000000000000000000000000..cd489d0bf5b1a17b115621a6e977a078c4c9ecb8 GIT binary patch literal 6499 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 literal 0 HcmV?d00001