Skip to content

Commit

Permalink
[Enhancement kbss-cvut#283] Add tests for dynamic Object properties
Browse files Browse the repository at this point in the history
  • Loading branch information
luxbe committed Nov 20, 2024
1 parent 9c8c167 commit 531c6d8
Show file tree
Hide file tree
Showing 5 changed files with 165 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/*
* 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.environment;

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.io.Serializable;
import java.lang.reflect.Field;
import java.net.URI;

@OWLClass(iri = Vocabulary.c_OwlClassU)
public class OWLClassV implements Serializable {

@Id
private URI id;

@OWLDataProperty(iri = Vocabulary.P_V_SINGULAR_DYNAMIC_ATTRIBUTE)
private Object singularDynamicAtt;

@OWLDataProperty(iri = Vocabulary.P_V_PLURAL_DYNAMIC_ATTRIBUTE)
private Object pluralDynamicAtt;

public OWLClassV() {
}

public OWLClassV(URI id) {
this.id = id;
}

public URI getId() {
return id;
}

public void setId(URI id) {
this.id = id;
}

public Object getSingularDynamicAtt() {
return singularDynamicAtt;
}

public void setSingularDynamicAtt(Object singularDynamicAtt) {
this.singularDynamicAtt = singularDynamicAtt;
}

public Object getPluralDynamicAtt() {
return pluralDynamicAtt;
}

public void setPluralDynamicAtt(Object pluralDynamicAtt) {
this.pluralDynamicAtt = pluralDynamicAtt;
}

@Override
public String toString() {
return "OWLClassU{" +
"id=" + id +
", singularDynamicAtt=" + singularDynamicAtt +
", pluralDynamicAtt=" + pluralDynamicAtt +
'}';
}

public static String getClassIri() {
return OWLClassV.class.getAnnotation(OWLClass.class).iri();
}

public static Field getIdField() throws Exception {
return OWLClassV.class.getDeclaredField("id");
}

public static Field getSingularDynamicAttField() throws Exception {
return OWLClassV.class.getDeclaredField("singularDynamicAtt");
}

public static Field getPluralDynamicAttField() throws Exception {
return OWLClassV.class.getDeclaredField("pluralDynamicAtt");
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ public class Vocabulary {
public static final String P_U_SINGULAR_MULTILINGUAL_ATTRIBUTE = ATTRIBUTE_BASE + "singularMultilingualAttribute";
public static final String P_U_PLURAL_MULTILINGUAL_ATTRIBUTE = ATTRIBUTE_BASE + "pluralMultilingualAttribute";

public static final String P_V_SINGULAR_DYNAMIC_ATTRIBUTE = ATTRIBUTE_BASE + "singularDynamicAttribute";
public static final String P_V_PLURAL_DYNAMIC_ATTRIBUTE = ATTRIBUTE_BASE + "pluralDynamicAttribute";

public static final String p_p_username = ATTRIBUTE_BASE + "username";
public static final String p_p_age = ATTRIBUTE_BASE + "age";
public static final String p_p_hasPhone = ATTRIBUTE_BASE + "hasPhone";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import cz.cvut.kbss.jopa.environment.OWLClassS;
import cz.cvut.kbss.jopa.environment.OWLClassT;
import cz.cvut.kbss.jopa.environment.OWLClassU;
import cz.cvut.kbss.jopa.environment.OWLClassV;
import cz.cvut.kbss.jopa.environment.OWLClassWithQueryAttr;
import cz.cvut.kbss.jopa.environment.Person;
import cz.cvut.kbss.jopa.environment.Phone;
Expand Down Expand Up @@ -86,6 +87,7 @@ private static Set<Class<?>> initEntityClasses() {
set.add(OWLClassS.class);
set.add(OWLClassT.class);
set.add(OWLClassU.class);
set.add(OWLClassV.class);
set.add(OWLClassWithQueryAttr.class);
set.add(Person.class);
set.add(Phone.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,16 @@

import cz.cvut.kbss.jopa.environment.OWLClassA;
import cz.cvut.kbss.jopa.environment.OWLClassJ;
import cz.cvut.kbss.jopa.environment.OWLClassV;
import cz.cvut.kbss.jopa.environment.Vocabulary;
import cz.cvut.kbss.jopa.exception.MetamodelInitializationException;
import cz.cvut.kbss.jopa.model.annotations.*;
import cz.cvut.kbss.jopa.model.annotations.Id;
import cz.cvut.kbss.jopa.model.annotations.OWLAnnotationProperty;
import cz.cvut.kbss.jopa.model.annotations.OWLClass;
import cz.cvut.kbss.jopa.model.annotations.OWLDataProperty;
import cz.cvut.kbss.jopa.model.annotations.ParticipationConstraints;
import cz.cvut.kbss.jopa.model.annotations.Sequence;
import cz.cvut.kbss.jopa.model.annotations.SequenceType;
import cz.cvut.kbss.jopa.utils.Configuration;
import cz.cvut.kbss.jopa.utils.NamespaceResolver;
import cz.cvut.kbss.jopa.vocabulary.RDF;
Expand All @@ -36,8 +43,16 @@
import java.util.List;
import java.util.Set;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

class ClassFieldMetamodelProcessorTest {

Expand Down Expand Up @@ -66,6 +81,40 @@ public void setInvalidAttribute(String invalidAttribute) {
}
}

@Test
void processDynamicObjectFieldIsResolvedAsSingularAttributeImpl() throws Exception {
final IdentifiableEntityType<OWLClassV> etMock = mock(IdentifiableEntityType.class);
when(etMock.getJavaType()).thenReturn(OWLClassV.class);
final ClassFieldMetamodelProcessor<OWLClassV> processor = prepareProcessorForClass(etMock);
final Field field = OWLClassV.getSingularDynamicAttField();
when(metamodelBuilder.hasManagedType(OWLClassV.class)).thenReturn(true);

processor.processField(field);

final ArgumentCaptor<AbstractAttribute> captor = ArgumentCaptor.forClass(AbstractAttribute.class);
verify(etMock).addDeclaredAttribute(eq(field.getName()), captor.capture());

assertInstanceOf(SingularAttributeImpl.class, captor.getValue());
assertEquals(Vocabulary.ATTRIBUTE_BASE + "singularDynamicAttribute", captor.getValue().getIRI().toString());
}

@Test
void processDynamicObjectFieldIsResolvedAsPluralAttributeImpl() throws Exception {
final IdentifiableEntityType<OWLClassV> etMock = mock(IdentifiableEntityType.class);
when(etMock.getJavaType()).thenReturn(OWLClassV.class);
final ClassFieldMetamodelProcessor<OWLClassV> processor = prepareProcessorForClass(etMock);
final Field field = OWLClassV.getPluralDynamicAttField();
when(metamodelBuilder.hasManagedType(OWLClassV.class)).thenReturn(true);

processor.processField(field);

final ArgumentCaptor<AbstractAttribute> captor = ArgumentCaptor.forClass(AbstractAttribute.class);
verify(etMock).addDeclaredAttribute(eq(field.getName()), captor.capture());

assertInstanceOf(SingularAttributeImpl.class, captor.getValue());
assertEquals(Vocabulary.ATTRIBUTE_BASE + "pluralDynamicAttribute", captor.getValue().getIRI().toString());
}

@Test
void processPluralFieldWithNonEmptyCardinalityConstraintAddsTheConstraintToAttributeSpecification() throws Exception {
final IdentifiableEntityType<OWLClassJ> etMock = mock(IdentifiableEntityType.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import cz.cvut.kbss.jopa.environment.OWLClassD;
import cz.cvut.kbss.jopa.environment.OWLClassM;
import cz.cvut.kbss.jopa.environment.OWLClassT;
import cz.cvut.kbss.jopa.environment.OWLClassV;
import cz.cvut.kbss.jopa.environment.Vocabulary;
import cz.cvut.kbss.jopa.environment.utils.TestLocal;
import cz.cvut.kbss.jopa.exception.InvalidFieldMappingException;
Expand All @@ -48,6 +49,7 @@
import cz.cvut.kbss.jopa.model.annotations.SparqlResultSetMapping;
import cz.cvut.kbss.jopa.model.annotations.Types;
import cz.cvut.kbss.jopa.model.lifecycle.LifecycleEvent;
import cz.cvut.kbss.jopa.oom.converter.ObjectConverter;
import cz.cvut.kbss.jopa.oom.converter.ObjectOneOfEnumConverter;
import cz.cvut.kbss.jopa.oom.converter.ToIntegerConverter;
import cz.cvut.kbss.jopa.oom.converter.datetime.LocalDateTimeConverter;
Expand Down Expand Up @@ -206,6 +208,16 @@ void buildMetamodelBuildsEntityWithLocalDateTimeConverter() throws Exception {
assertThat(result.getConverter(), instanceOf(LocalDateTimeConverter.class));
}

@Test
void buildMetamodelBuildsEntityWithObjectConverterForDynamicAttributes() throws Exception {
when(finderMock.getEntities()).thenReturn(Collections.singleton(OWLClassV.class));
builder.buildMetamodel(finderMock);
final IdentifiableEntityType<OWLClassV> et = (IdentifiableEntityType<OWLClassV>) builder.getEntityClass(OWLClassV.class);
final AbstractAttribute<OWLClassV, LocalDateTime> result = (AbstractAttribute<OWLClassV, LocalDateTime>) et
.getDeclaredAttribute(OWLClassV.getSingularDynamicAttField().getName());
assertThat(result.getConverter(), instanceOf(ObjectConverter.class));
}

@Test
void buildMetamodelBuildsEntityWithParentLifecycleCallbacks() {
when(finderMock.getEntities()).thenReturn(Collections.singleton(ChildWithCallback.class));
Expand Down

0 comments on commit 531c6d8

Please sign in to comment.