package com.taskadapter.redmineapi;
import com.taskadapter.redmineapi.bean.CustomFieldDefinition;
import com.taskadapter.redmineapi.internal.RedmineJSONParser;
import com.taskadapter.redmineapi.internal.json.JsonInput;
import java.io.IOException;
import org.junit.BeforeClass;
import org.junit.Test;
import java.util.List;
import org.json.JSONException;
import static org.assertj.core.api.Assertions.assertThat;
/**
* The tests expect some manual (one-time) setup in the Redmine server because
* there is no remote API to create custom fields definitions (as of January 2015).
* <p>
* Exactly 3 custom fields must be configured:
* - id: 1, customized_type: issue, name: my_custom_1, type: string
* - id: 2, customized_type: issue, name: custom_boolean_1, type: bool
* - id: 3, customized_type: issue, name: custom_multi_list, type: list,
* multiple: true, possible_values: V1, V2, V3, default: V2
*/
public class CustomFieldDefinitionsIT {
private static final String CUSTOM_FIELDS_FILE = "custom_fields_redmine_2.3.json";
private static CustomFieldManager customFieldManager;
@BeforeClass
public static void oneTimeSetup() {
RedmineManager mgr = IntegrationTestHelper.createRedmineManager();
customFieldManager = mgr.getCustomFieldManager();
}
@Test
public void testGetCustomFields() throws RedmineException {
final List<CustomFieldDefinition> definitions = customFieldManager.getCustomFieldDefinitions();
assertThat(definitions.size()).isGreaterThanOrEqualTo(3);
final CustomFieldDefinition myCustom1 = getCustomFieldDefinitionByName(definitions, "my_custom_1");
assertThat(myCustom1.getCustomizedType()).isEqualTo("issue");
assertThat(myCustom1.getFieldFormat()).isEqualTo("string");
final CustomFieldDefinition customBoolean1 = getCustomFieldDefinitionByName(definitions, "custom_boolean_1");
assertThat(customBoolean1.getCustomizedType()).isEqualTo("issue");
assertThat(customBoolean1.getFieldFormat()).isEqualTo("bool");
final CustomFieldDefinition customMultiList = getCustomFieldDefinitionByName(definitions, "custom_multi_list");
assertThat(customMultiList.getCustomizedType()).isEqualTo("issue");
assertThat(customMultiList.getFieldFormat()).isEqualTo("list");
assertThat(customMultiList.getDefaultValue()).isEqualTo("V2");
assertThat(customMultiList.getPossibleValues()).containsExactly("V1", "V2", "V3");
assertThat(customMultiList.isMultiple()).isTrue();
}
private static CustomFieldDefinition getCustomFieldDefinitionByName(List<CustomFieldDefinition> definitions, String name) {
for (CustomFieldDefinition definition : definitions) {
if (name.equals(definition.getName())) {
return definition;
}
}
throw new RuntimeException("Custom Field Definition not found: " + name);
}
@Test
public void savedJSonResponseFromRedmine23CanBeParsed() throws IOException, JSONException {
String str = MyIOUtils.getResourceAsString(CUSTOM_FIELDS_FILE);
List<CustomFieldDefinition> definitions = JsonInput.getListOrEmpty(
RedmineJSONParser.getResponse(str), "custom_fields",
RedmineJSONParser::parseCustomFieldDefinition);
CustomFieldDefinition field0 = definitions.get(0);
assertThat(field0.getId()).isEqualTo(1);
assertThat(field0.getName()).isEqualTo("my_custom_1");
assertThat(field0.getCustomizedType()).isEqualTo("issue");
assertThat(field0.getFieldFormat()).isEqualTo("string");
assertThat(field0.getRegexp()).isEqualTo("some.*");
assertThat(field0.getMinLength()).isEqualTo((Integer) 5);
assertThat(field0.getMaxLength()).isEqualTo((Integer) 80);
assertThat(field0.isFilter()).isEqualTo(true);
assertThat(field0.isSearchable()).isEqualTo(true);
assertThat(field0.isMultiple()).isEqualTo(false);
assertThat(field0.isVisible()).isEqualTo(true);
assertThat(field0.isRequired()).isEqualTo(false);
assertThat(field0.getDefaultValue()).isEqualTo("");
assertThat(field0.getPossibleValues().size()).isEqualTo(0);
assertThat(field0.getTrackers().get(0).getId()).isEqualTo((Integer) 1);
assertThat(field0.getTrackers().get(1).getId()).isEqualTo((Integer) 2);
assertThat(field0.getTrackers().get(2).getId()).isEqualTo((Integer) 3);
assertThat(field0.getRoles().size()).isEqualTo(0);
CustomFieldDefinition field1 = definitions.get(1);
assertThat(field1.getId()).isEqualTo((Integer) 2);
assertThat(field1.getName()).isEqualTo("custom_boolean_1");
assertThat(field1.getCustomizedType()).isEqualTo("issue");
assertThat(field1.getFieldFormat()).isEqualTo("bool");
assertThat(field1.getRegexp()).isEqualTo("");
assertThat(field1.getMinLength()).isEqualTo(null);
assertThat(field1.getMaxLength()).isEqualTo(null);
assertThat(field1.isFilter()).isEqualTo(false);
assertThat(field1.isSearchable()).isEqualTo(false);
assertThat(field1.isMultiple()).isEqualTo(false);
assertThat(field1.isVisible()).isEqualTo(true);
assertThat(field1.isRequired()).isEqualTo(false);
assertThat(field1.getDefaultValue()).isEqualTo("");
assertThat(field1.getPossibleValues().get(0)).isEqualTo("1");
assertThat(field1.getPossibleValues().get(1)).isEqualTo("0");
assertThat(field1.getTrackers().size()).isEqualTo(3);
assertThat(field1.getRoles().size()).isEqualTo(0);
CustomFieldDefinition field2 = definitions.get(2);
assertThat(field2.getId()).isEqualTo((Integer) 3);
assertThat(field2.getName()).isEqualTo("Test");
assertThat(field2.getCustomizedType()).isEqualTo("issue");
assertThat(field2.getFieldFormat()).isEqualTo("bool");
assertThat(field2.getRegexp()).isEqualTo("");
assertThat(field2.getMinLength()).isEqualTo(null);
assertThat(field2.getMaxLength()).isEqualTo(null);
assertThat(field2.isFilter()).isEqualTo(false);
assertThat(field2.isSearchable()).isEqualTo(false);
assertThat(field2.isMultiple()).isEqualTo(false);
assertThat(field2.isVisible()).isEqualTo(false);
assertThat(field2.isRequired()).isEqualTo(true);
assertThat(field2.getDefaultValue()).isEqualTo("1");
assertThat(field2.getPossibleValues().get(0)).isEqualTo("1");
assertThat(field2.getPossibleValues().get(1)).isEqualTo("0");
assertThat(field2.getTrackers().size()).isEqualTo(0);
assertThat(field2.getRoles().get(0).getId()).isEqualTo((Integer) 4);
}
}