/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.solr.schema; import java.util.Collection; import org.apache.solr.SolrTestCaseJ4; import org.apache.solr.core.SolrCore; import org.apache.solr.schema.SchemaField; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; /** * */ public class RequiredFieldsTest extends SolrTestCaseJ4 { @BeforeClass public static void beforeClass() throws Exception { initCore("solrconfig.xml","schema-required-fields.xml"); } @Test public void testRequiredFieldsConfig() { SolrCore core = h.getCore(); IndexSchema schema = core.getSchema(); SchemaField uniqueKey = schema.getUniqueKeyField(); // Make sure the uniqueKey is required assertTrue( uniqueKey.isRequired() ); assertTrue( schema.getRequiredFields().contains( uniqueKey ) ); // we specified one required field, but all devault valued fields are also required Collection<SchemaField> requiredFields =schema.getRequiredFields(); int numDefaultFields = schema.getFieldsWithDefaultValue().size(); assertEquals( numDefaultFields+1+1, requiredFields.size()); // also the uniqueKey } @Test public void testRequiredFieldsSingleAdd() { SolrCore core = h.getCore(); // Add a single document assertU("adding document", adoc("id", "529", "name", "document with id, name, and subject", "field_t", "what's inside?", "subject", "info")); assertU(commit()); // Check it it is in the index assertQ("should find one", req("id:529") ,"//result[@numFound=1]" ); // Add another document without the required subject field, which // has a configured defaultValue of "Stuff" assertU("adding a doc without field w/ configured default", adoc("id", "530", "name", "document with id and name", "field_t", "what's inside?")); assertU(commit()); // Add another document without a subject, which has a default in schema String subjectDefault = core.getSchema().getField("subject").getDefaultValue(); assertNotNull("subject has no default value", subjectDefault); assertQ("should find one with subject="+subjectDefault, req("id:530 subject:"+subjectDefault) ,"//result[@numFound=1]" ); // Add another document without a required name, which has no default assertNull(core.getSchema().getField("name").getDefaultValue()); ignoreException("missing required field"); assertFailedU("adding doc without required field", adoc("id", "531", "subject", "no name document", "field_t", "what's inside?") ); resetExceptionIgnores(); assertU(commit()); // Check to make sure this submission did not succeed assertQ("should not find any", req("id:531") ,"//result[@numFound=0]" ); clearIndex(); } @Test public void testAddMultipleDocumentsWithErrors() { //Add three documents at once to make sure the baseline succeeds assertU("adding 3 documents", "<add>" +doc("id", "601", "name", "multiad one", "field_t", "what's inside?", "subject", "info") + doc("id", "602", "name", "multiad two", "field_t", "what's inside?", "subject", "info") + doc("id", "603", "name", "multiad three", "field_t", "what's inside?", "subject", "info") + "</add>"); assertU(commit()); // Check that they are in the index assertQ("should find three", req("name:multiad") ,"//result[@numFound=3]" ); // Add three documents at once, with the middle one missing a field that has a default assertU("adding 3 docs, with 2nd one missing a field that has a default value", "<add>" +doc("id", "601", "name", "nosubject batch one", "field_t", "what's inside?", "subject", "info") + doc("id", "602", "name", "nosubject batch two", "field_t", "what's inside?") + doc("id", "603", "name", "nosubject batch three", "field_t", "what's inside?", "subject", "info") + "</add>"); assertU(commit()); // Since the missing field had a devault value, // All three should have made it into the index assertQ("should find three", req("name:nosubject") ,"//result[@numFound=3]" ); // Add three documents at once, with the middle with a bad field definition, // to establish the baselinie behavior for errors in a multi-ad submission assertFailedU("adding 3 documents, with 2nd one with undefined field", "<add>" +doc("id", "801", "name", "baddef batch one", "field_t", "what's inside?", "subject", "info") + doc("id", "802", "name", "baddef batch two", "missing_field_ignore_exception", "garbage") + doc("id", "803", "name", "baddef batch three", "field_t", "what's inside?", "subject", "info") + "</add>"); assertU(commit()); // Check that only docs before the error should be in the index assertQ("should find one", req("name:baddef") ,"//result[@numFound=1]" ); ignoreException("missing required field"); // Add three documents at once, with the middle one missing a required field that has no default assertFailedU("adding 3 docs, with 2nd one missing required field", "<add>" +doc("id", "701", "name", "noname batch one", "field_t", "what's inside?", "subject", "info") + doc("id", "702", "field_t", "what's inside?", "subject", "info") + doc("id", "703", "name", "noname batch batch three", "field_t", "what's inside?", "subject", "info") + "</add>"); resetExceptionIgnores(); assertU(commit()); // Check that only docs before the error should be in the index assertQ("should find one", req("name:noname") ,"//result[@numFound=1]" ); } }