@Test public void shouldReportNodeThatIsNotIndexed() throws Exception { // given IndexRule indexRule = indexRule( indexId, labelId, propertyKeyId, new Descriptor( "provider1", "version1" ) ); NodeRecord nodeRecord = nodeWithLabels( labelId ); NodeCorrectlyIndexedCheck check = new NodeCorrectlyIndexedCheck( indexContaining( indexRule, new HashMap<Object, long[]>() ), nodeHasProperty( nodeRecord, "propertyValue" ) ); ConsistencyReport.NodeConsistencyReport report = mock( ConsistencyReport.NodeConsistencyReport.class ); // when check.check( nodeRecord, engineFor( report ), null ); // then verify( report ).notIndexed( indexRule, "propertyValue" ); }
@Test public void shouldBeSilentWhenNodesCorrectlyIndexed() throws Exception { // given IndexRule indexRule = indexRule( indexId, labelId, propertyKeyId, new Descriptor( "provider1", "version1" ) ); NodeRecord nodeRecord = nodeWithLabels( labelId ); NodeCorrectlyIndexedCheck check = new NodeCorrectlyIndexedCheck( indexContaining( indexRule, Collections.<Object, long[]>singletonMap( "propertyValue", new long[]{nodeRecord.getId()} ) ), nodeHasProperty( nodeRecord, "propertyValue" ) ); ConsistencyReport.NodeConsistencyReport report = mock( ConsistencyReport.NodeConsistencyReport.class ); // when check.check( nodeRecord, engineFor( report ), null ); // then verifyZeroInteractions( report ); }
@Test public void shouldReportDuplicateNode() throws Exception { // given IndexRule indexRule = constraintIndexRule( indexId, labelId, propertyKeyId, new Descriptor( "provider1", "version1" ), constraintId ); NodeRecord nodeRecord = nodeWithLabels( labelId ); long duplicateNodeId1 = 1; long duplicateNodeId2 = 2; NodeCorrectlyIndexedCheck check = new NodeCorrectlyIndexedCheck( indexContaining( indexRule, Collections.<Object, long[]>singletonMap( "propertyValue", new long[]{nodeRecord.getId(), duplicateNodeId1, duplicateNodeId2} ) ), nodeHasProperty( nodeRecord, "propertyValue" ) ); ConsistencyReport.NodeConsistencyReport report = mock( ConsistencyReport.NodeConsistencyReport.class ); // when check.check( nodeRecord, engineFor( report ), null ); // then verify( report ).uniqueIndexNotUnique( indexRule, "propertyValue", duplicateNodeId1 ); verify( report ).uniqueIndexNotUnique( indexRule, "propertyValue", duplicateNodeId2 ); }
return IndexRule.indexRule( 1, 2, 3, new SchemaIndexProvider.Descriptor( "provider", "version" ) );
@Test public void shouldReportConstraintIndexNotReferencingBack() throws Exception { // given int ruleId1 = 0; int ruleId2 = 1; int labelId = 1; int propertyKeyId = 2; DynamicRecord record1 = inUse( dynamicRecord( ruleId1 ) ); DynamicRecord record2 = inUse( dynamicRecord( ruleId2) ); SchemaIndexProvider.Descriptor providerDescriptor = new SchemaIndexProvider.Descriptor( "in-memory", "1.0" ); IndexRule rule1 = IndexRule.constraintIndexRule( ruleId1, labelId, propertyKeyId, providerDescriptor, (long) ruleId1 ); UniquePropertyConstraintRule rule2 = UniquePropertyConstraintRule .uniquenessConstraintRule( ruleId2, labelId, propertyKeyId, ruleId1 ); when( checker().ruleAccess.loadSingleSchemaRule( ruleId1 ) ).thenReturn( rule1 ); when( checker().ruleAccess.loadSingleSchemaRule( ruleId2 ) ).thenReturn( rule2 ); add( inUse( new LabelTokenRecord( labelId ) ) ); add( inUse( new PropertyKeyTokenRecord( propertyKeyId ) ) ); // when check( record1 ); check( record2 ); SchemaRecordCheck obligationChecker = checker().forObligationChecking(); ConsistencyReport.SchemaConsistencyReport report = check( obligationChecker, record1 ); check( obligationChecker, record2 ); // then verify( report ).constraintIndexRuleNotReferencingBack( record2 ); }
@Test public void shouldReportUniquenessConstraintNotReferencingBack() throws Exception { // given int ruleId1 = 0; int ruleId2 = 1; int labelId = 1; int propertyKeyId = 2; DynamicRecord record1 = inUse( dynamicRecord( ruleId1 ) ); DynamicRecord record2 = inUse( dynamicRecord( ruleId2 ) ); SchemaIndexProvider.Descriptor providerDescriptor = new SchemaIndexProvider.Descriptor( "in-memory", "1.0" ); IndexRule rule1 = IndexRule.constraintIndexRule( ruleId1, labelId, propertyKeyId, providerDescriptor, (long) ruleId2 ); UniquePropertyConstraintRule rule2 = UniquePropertyConstraintRule .uniquenessConstraintRule( ruleId2, labelId, propertyKeyId, ruleId2 ); when( checker().ruleAccess.loadSingleSchemaRule( ruleId1 ) ).thenReturn( rule1 ); when( checker().ruleAccess.loadSingleSchemaRule( ruleId2 ) ).thenReturn( rule2 ); add( inUse( new LabelTokenRecord( labelId ) ) ); add( inUse( new PropertyKeyTokenRecord( propertyKeyId ) ) ); // when check( record1 ); check( record2 ); SchemaRecordCheck obligationChecker = checker().forObligationChecking(); check( obligationChecker, record1 ); ConsistencyReport.SchemaConsistencyReport report = check( obligationChecker, record2 ); // then verify( report ).uniquenessConstraintNotReferencingBack( record1 ); }
@Test public void shouldReportTwoIndexRulesWithDuplicateContent() throws Exception { // given int ruleId1 = 0; int ruleId2 = 1; int labelId = 1; int propertyKeyId = 2; DynamicRecord record1 = inUse( dynamicRecord( ruleId1 ) ); DynamicRecord record2 = inUse( dynamicRecord( ruleId2 ) ); SchemaIndexProvider.Descriptor providerDescriptor = new SchemaIndexProvider.Descriptor( "in-memory", "1.0" ); IndexRule rule1 = IndexRule.constraintIndexRule( ruleId1, labelId, propertyKeyId, providerDescriptor, (long) ruleId1 ); IndexRule rule2 = IndexRule.constraintIndexRule( ruleId2, labelId, propertyKeyId, providerDescriptor, (long) ruleId2 ); when( checker().ruleAccess.loadSingleSchemaRule( ruleId1 ) ).thenReturn( rule1 ); when( checker().ruleAccess.loadSingleSchemaRule( ruleId2 ) ).thenReturn( rule2 ); add( inUse( new LabelTokenRecord( labelId ) ) ); add( inUse( new PropertyKeyTokenRecord( propertyKeyId ) ) ); // when check( record1 ); ConsistencyReport.SchemaConsistencyReport report = check( record2 ); // then verify( report ).duplicateRuleContent( record1 ); }
@Test public void shouldReportTwoConstraintIndexesReferencingSameConstraint() throws Exception { // given int ruleId1 = 0; int ruleId2 = 1; int labelId = 1; int propertyKeyId = 2; DynamicRecord record1 = inUse( dynamicRecord( ruleId1 ) ); DynamicRecord record2 = inUse( dynamicRecord( ruleId2 ) ); SchemaIndexProvider.Descriptor providerDescriptor = new SchemaIndexProvider.Descriptor( "in-memory", "1.0" ); IndexRule rule1 = IndexRule.constraintIndexRule( ruleId1, labelId, propertyKeyId, providerDescriptor, (long) ruleId1 ); IndexRule rule2 = IndexRule.constraintIndexRule( ruleId2, labelId, propertyKeyId, providerDescriptor, (long) ruleId1 ); when( checker().ruleAccess.loadSingleSchemaRule( ruleId1 ) ).thenReturn( rule1 ); when( checker().ruleAccess.loadSingleSchemaRule( ruleId2 ) ).thenReturn( rule2 ); add( inUse( new LabelTokenRecord( labelId ) ) ); add( inUse( new PropertyKeyTokenRecord( propertyKeyId ) ) ); // when check( record1 ); ConsistencyReport.SchemaConsistencyReport report = check( record2 ); // then verify( report ).duplicateObligation( record1 ); }
@Test public void shouldNotReportConstraintIndexRuleWithoutBackReference() throws Exception { // given int ruleId = 1; int labelId = 1; int propertyKeyId = 2; DynamicRecord record = inUse( dynamicRecord( ruleId ) ); SchemaIndexProvider.Descriptor providerDescriptor = new SchemaIndexProvider.Descriptor( "in-memory", "1.0" ); IndexRule rule = IndexRule.constraintIndexRule( ruleId, labelId, propertyKeyId, providerDescriptor, null ); when( checker().ruleAccess.loadSingleSchemaRule( ruleId ) ).thenReturn( rule ); add( inUse( new LabelTokenRecord( labelId ) ) ); add( inUse( new PropertyKeyTokenRecord( propertyKeyId ) ) ); // when check( record ); SchemaRecordCheck obligationChecker = checker().forObligationChecking(); ConsistencyReport.SchemaConsistencyReport report = check( obligationChecker, record ); // then verifyZeroInteractions( report ); }
@Test public void shouldReportUnreferencedConstraintIndex() throws Exception { // given int ruleId = 0; int labelId = 1; int propertyKeyId = 2; DynamicRecord record = inUse( dynamicRecord( ruleId ) ); SchemaIndexProvider.Descriptor providerDescriptor = new SchemaIndexProvider.Descriptor( "in-memory", "1.0" ); IndexRule rule = IndexRule.constraintIndexRule( ruleId, labelId, propertyKeyId, providerDescriptor, (long) ruleId ); when( checker().ruleAccess.loadSingleSchemaRule( ruleId ) ).thenReturn( rule ); add( inUse( new LabelTokenRecord( labelId ) ) ); add( inUse( new PropertyKeyTokenRecord( propertyKeyId ) ) ); // when check( record ); SchemaRecordCheck obligationChecker = checker().forObligationChecking(); ConsistencyReport.SchemaConsistencyReport report = check( obligationChecker, record ); // then verify( report ).missingObligation( SchemaRule.Kind.UNIQUENESS_CONSTRAINT ); }
@Test public void shouldReportNodeIndexedMultipleTimes() throws Exception { // given IndexRule indexRule = indexRule( indexId, labelId, propertyKeyId, new Descriptor( "provider1", "version1" ) ); NodeRecord nodeRecord = nodeWithLabels( labelId ); long nodeId = nodeRecord.getId(); NodeCorrectlyIndexedCheck check = new NodeCorrectlyIndexedCheck( indexContaining( indexRule, MapUtil.<Object,long[]>genericMap( "propertyValue", new long[] {nodeId, nodeId, nodeId} ) ), nodeHasProperty( nodeRecord, "propertyValue" ) ); ConsistencyReport.NodeConsistencyReport report = mock( ConsistencyReport.NodeConsistencyReport.class ); // when check.check( nodeRecord, engineFor( report ), null ); // then verify( report ).indexedMultipleTimes( indexRule, "propertyValue", 3 ); }
@Test public void shouldReportInvalidLabelReferences() throws Exception { // given int schemaRuleId = 0; int labelId = 1; int propertyKeyId = 2; DynamicRecord record = inUse( dynamicRecord( schemaRuleId ) ); SchemaIndexProvider.Descriptor providerDescriptor = new SchemaIndexProvider.Descriptor( "in-memory", "1.0" ); IndexRule rule = IndexRule.indexRule( schemaRuleId, labelId, propertyKeyId, providerDescriptor ); when( checker().ruleAccess.loadSingleSchemaRule( schemaRuleId ) ).thenReturn( rule ); LabelTokenRecord labelTokenRecord = add ( notInUse( new LabelTokenRecord( labelId ) ) ); add(inUse( new PropertyKeyTokenRecord( propertyKeyId ) ) ); // when ConsistencyReport.SchemaConsistencyReport report = check( record ); // then verify( report ).labelNotInUse( labelTokenRecord ); }
@Test public void shouldReportInvalidPropertyReferenceFromIndexRule() throws Exception { // given int schemaRuleId = 0; int labelId = 1; int propertyKeyId = 2; DynamicRecord record = inUse( dynamicRecord( schemaRuleId ) ); SchemaIndexProvider.Descriptor providerDescriptor = new SchemaIndexProvider.Descriptor( "in-memory", "1.0" ); IndexRule rule = IndexRule.indexRule( schemaRuleId, labelId, propertyKeyId, providerDescriptor ); when( checker().ruleAccess.loadSingleSchemaRule( schemaRuleId ) ).thenReturn( rule ); add( inUse( new LabelTokenRecord( labelId ) ) ); PropertyKeyTokenRecord propertyKeyToken = add( notInUse( new PropertyKeyTokenRecord( propertyKeyId ) ) ); // when ConsistencyReport.SchemaConsistencyReport report = check( record ); // then verify( report ).propertyKeyNotInUse( propertyKeyToken ); }