From fbd60ba7112a14211209e69a1d9eb20d841d5470 Mon Sep 17 00:00:00 2001 From: luxbe Date: Thu, 21 Nov 2024 13:18:40 +0100 Subject: [PATCH] [Enhancement #283] Add integration tests for dynamic attributes --- .../cz/cvut/kbss/jopa/test/OWLClassAA.java | 51 +++++++++++++++++++ .../cz/cvut/kbss/jopa/test/Vocabulary.java | 2 + .../kbss/jopa/test/runner/BaseRunner.java | 34 +++++++++++-- .../test/runner/CreateOperationsRunner.java | 34 +++++++++++++ .../test/runner/RetrieveOperationsRunner.java | 31 +++++++++++ .../test/runner/UpdateOperationsRunner.java | 19 +++++++ 6 files changed, 168 insertions(+), 3 deletions(-) create mode 100644 jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/OWLClassAA.java diff --git a/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/OWLClassAA.java b/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/OWLClassAA.java new file mode 100644 index 000000000..f525f71ae --- /dev/null +++ b/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/OWLClassAA.java @@ -0,0 +1,51 @@ +/* + * JOPA + * Copyright (C) 2024 Czech Technical University in Prague + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package cz.cvut.kbss.jopa.test; + +import cz.cvut.kbss.jopa.model.annotations.Id; +import cz.cvut.kbss.jopa.model.annotations.OWLClass; +import cz.cvut.kbss.jopa.model.annotations.OWLDataProperty; + +import java.net.URI; + +@OWLClass(iri = Vocabulary.C_OWL_CLASS_Z) +public class OWLClassAA implements HasUri { + + @Id + private URI uri; + + @OWLDataProperty(iri = Vocabulary.P_AA_DYNAMIC_ATTRIBUTE, simpleLiteral = true) + private Object dynamicProperty; + + @Override + public URI getUri() { + return uri; + } + + public void setUri(URI uri) { + this.uri = uri; + } + + public Object getDynamicProperty() { + return dynamicProperty; + } + + public void setDynamicProperty(Object dynamicProperty) { + this.dynamicProperty = dynamicProperty; + } +} diff --git a/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/Vocabulary.java b/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/Vocabulary.java index 5c0a28f64..5a5bfb403 100644 --- a/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/Vocabulary.java +++ b/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/Vocabulary.java @@ -148,6 +148,8 @@ public class Vocabulary { public static final String P_Y_SINGULAR_MULTILINGUAL_ATTRIBUTE = ATTRIBUTE_IRI_BASE + "ySingularMultilingual"; public static final String P_Y_PLURAL_MULTILINGUAL_ATTRIBUTE = ATTRIBUTE_IRI_BASE + "yPluralMultilingual"; + public static final String P_AA_DYNAMIC_ATTRIBUTE = ATTRIBUTE_IRI_BASE + "aaDynamicAttribute"; + public static final String P_HAS_H = ATTRIBUTE_IRI_BASE + "hasH"; private Vocabulary() { diff --git a/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/BaseRunner.java b/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/BaseRunner.java index 184907a86..80d47ebf4 100644 --- a/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/BaseRunner.java +++ b/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/BaseRunner.java @@ -20,7 +20,25 @@ import cz.cvut.kbss.jopa.model.EntityManager; import cz.cvut.kbss.jopa.model.descriptors.Descriptor; import cz.cvut.kbss.jopa.model.metamodel.FieldSpecification; -import cz.cvut.kbss.jopa.test.*; +import cz.cvut.kbss.jopa.test.OWLClassA; +import cz.cvut.kbss.jopa.test.OWLClassAA; +import cz.cvut.kbss.jopa.test.OWLClassB; +import cz.cvut.kbss.jopa.test.OWLClassC; +import cz.cvut.kbss.jopa.test.OWLClassD; +import cz.cvut.kbss.jopa.test.OWLClassE; +import cz.cvut.kbss.jopa.test.OWLClassG; +import cz.cvut.kbss.jopa.test.OWLClassH; +import cz.cvut.kbss.jopa.test.OWLClassI; +import cz.cvut.kbss.jopa.test.OWLClassM; +import cz.cvut.kbss.jopa.test.OWLClassN; +import cz.cvut.kbss.jopa.test.OWLClassP; +import cz.cvut.kbss.jopa.test.OWLClassQ; +import cz.cvut.kbss.jopa.test.OWLClassWithQueryAttr; +import cz.cvut.kbss.jopa.test.OWLClassWithQueryAttr2; +import cz.cvut.kbss.jopa.test.OWLClassWithQueryAttr3; +import cz.cvut.kbss.jopa.test.OWLClassWithQueryAttr4; +import cz.cvut.kbss.jopa.test.OWLClassWithQueryAttr5; +import cz.cvut.kbss.jopa.test.OWLClassWithQueryAttr6; import cz.cvut.kbss.jopa.test.environment.DataAccessor; import cz.cvut.kbss.jopa.test.environment.PersistenceFactory; import cz.cvut.kbss.jopa.test.environment.Quad; @@ -29,9 +47,15 @@ import org.slf4j.Logger; import java.net.URI; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; public abstract class BaseRunner { @@ -67,6 +91,8 @@ public abstract class BaseRunner { protected OWLClassWithQueryAttr4 entityWithQueryAttr4; protected OWLClassWithQueryAttr5 entityWithQueryAttr5; protected OWLClassWithQueryAttr6 entityWithQueryAttr6; + // Dynamic attributes + protected OWLClassAA entityAA; protected final DataAccessor dataAccessor; protected final PersistenceFactory persistenceFactory; @@ -147,6 +173,8 @@ private void init() { entityWithQueryAttr5.setUri(URI.create("http://krizik.felk.cvut.cz/ontologies/jopa/tests/entityWithQueryAttr5")); this.entityWithQueryAttr6 = new OWLClassWithQueryAttr6(); entityWithQueryAttr6.setUri(URI.create("http://krizik.felk.cvut.cz/ontologies/jopa/tests/entityWithQueryAttr6")); + this.entityAA = new OWLClassAA(); + this.entityAA.setUri(URI.create("http://krizik.felk.cvut.cz/ontologies/jopa/tests/entityAA")); } @AfterEach diff --git a/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/CreateOperationsRunner.java b/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/CreateOperationsRunner.java index 1b4deb46b..78fdf989b 100644 --- a/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/CreateOperationsRunner.java +++ b/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/CreateOperationsRunner.java @@ -58,6 +58,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -683,4 +684,37 @@ void persistSupportsAnnotationPropertyValueMappedToSimpleLiteral() throws Except new Quad(URI.create(entityM.getKey()), URI.create(Vocabulary.p_m_simpleLiteral), entityM.getSimpleLiteral(), (String) null)), em); } + + @Test + void persistSupportsDynamicPropertyIntegerValueMappedToSimpleLiteral() throws Exception { + this.em = getEntityManager("persistSupportsDynamicPropertyValueMappedToSimpleLiteral", false); + entityAA.setDynamicProperty(1234); + persist(entityAA); + + verifyStatementsPresent(List.of( + new Quad(entityAA.getUri(), URI.create(Vocabulary.P_AA_DYNAMIC_ATTRIBUTE), + entityAA.getDynamicProperty(), (String) null)), em); + } + + @Test + void persistSupportsDynamicPropertyStringValueMappedToSimpleLiteral() throws Exception { + this.em = getEntityManager("persistSupportsDynamicPropertyValueMappedToSimpleLiteral", false); + entityAA.setDynamicProperty("Hello, world!"); + persist(entityAA); + + verifyStatementsPresent(List.of( + new Quad(entityAA.getUri(), URI.create(Vocabulary.P_AA_DYNAMIC_ATTRIBUTE), + entityAA.getDynamicProperty(), (String) null)), em); + } + + @Test + void persistSupportsDynamicPropertyDateValueMappedToSimpleLiteral() throws Exception { + this.em = getEntityManager("persistSupportsDynamicPropertyValueMappedToSimpleLiteral", false); + entityAA.setDynamicProperty(new Date()); + persist(entityAA); + + verifyStatementsPresent(List.of( + new Quad(entityAA.getUri(), URI.create(Vocabulary.P_AA_DYNAMIC_ATTRIBUTE), + entityAA.getDynamicProperty(), (String) null)), em); + } } diff --git a/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/RetrieveOperationsRunner.java b/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/RetrieveOperationsRunner.java index 17af7de89..daf1e5897 100644 --- a/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/RetrieveOperationsRunner.java +++ b/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/RetrieveOperationsRunner.java @@ -23,6 +23,7 @@ import cz.cvut.kbss.jopa.model.query.TypedQuery; import cz.cvut.kbss.jopa.proxy.lazy.LazyLoadingProxy; import cz.cvut.kbss.jopa.test.OWLClassA; +import cz.cvut.kbss.jopa.test.OWLClassAA; import cz.cvut.kbss.jopa.test.OWLClassB; import cz.cvut.kbss.jopa.test.OWLClassC; import cz.cvut.kbss.jopa.test.OWLClassD; @@ -610,4 +611,34 @@ void lazilyLoadedAttributeIsNullWhenThereIsNoReferenceToLoad() { final OWLClassI result = findRequired(OWLClassI.class, entityI.getUri()); assertNull(result.getOwlClassA()); } + + @Test + public void retrieveDynamicStringAttribute() { + this.em = getEntityManager("retrieveDynamicAttribute", false); + entityAA.setDynamicProperty("Hello, world!"); + transactional(() -> em.persist(entityAA)); + + final OWLClassAA result = findRequired(OWLClassAA.class, entityAA.getUri()); + assertEquals("Hello, world!", result.getDynamicProperty()); + } + + @Test + public void retrieveDynamicIntAttribute() { + this.em = getEntityManager("retrieveDynamicAttribute", false); + entityAA.setDynamicProperty(1234); + transactional(() -> em.persist(entityAA)); + + final OWLClassAA result = findRequired(OWLClassAA.class, entityAA.getUri()); + assertEquals(1234, result.getDynamicProperty()); + } + + @Test + public void retrieveDynamicDoubleAttribute() { + this.em = getEntityManager("retrieveDynamicAttribute", false); + entityAA.setDynamicProperty(Double.parseDouble("1234.6970")); + transactional(() -> em.persist(entityAA)); + + final OWLClassAA result = findRequired(OWLClassAA.class, entityAA.getUri()); + assertEquals(1234.697D, result.getDynamicProperty()); + } } diff --git a/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/UpdateOperationsRunner.java b/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/UpdateOperationsRunner.java index 966d8343b..4767e5d5f 100644 --- a/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/UpdateOperationsRunner.java +++ b/jopa-integration-tests/src/main/java/cz/cvut/kbss/jopa/test/runner/UpdateOperationsRunner.java @@ -25,6 +25,7 @@ import cz.cvut.kbss.jopa.oom.exception.UnpersistedChangeException; import cz.cvut.kbss.jopa.proxy.lazy.LazyLoadingProxy; import cz.cvut.kbss.jopa.test.OWLClassA; +import cz.cvut.kbss.jopa.test.OWLClassAA; import cz.cvut.kbss.jopa.test.OWLClassB; import cz.cvut.kbss.jopa.test.OWLClassD; import cz.cvut.kbss.jopa.test.OWLClassE; @@ -1171,4 +1172,22 @@ public void concurrentTransactionsLeaveDataInConsistentState() { final OWLClassA result = em.find(OWLClassA.class, entityA.getUri()); assertEquals(a2String, result.getStringAttribute()); } + + @Test + public void updateDynamicAttribute() { + this.em = getEntityManager("updateDynamicAttribute", false); + entityAA.setDynamicProperty("Hello, world!"); + persist(entityAA); + + Object propertyBeforeUpdate = findRequired(OWLClassAA.class, entityAA.getUri()).getDynamicProperty(); + assertEquals(propertyBeforeUpdate, "Hello, world!"); + + em.getTransaction().begin(); + entityAA.setDynamicProperty(1234L); + em.merge(entityAA); + em.getTransaction().commit(); + + Object propertyAfterUpdate = findRequired(OWLClassAA.class, entityAA.getUri()).getDynamicProperty(); + assertEquals(1234L, propertyAfterUpdate); + } }