package com.box.sdk; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; import com.eclipsesource.json.JsonObject; import com.github.tomakehurst.wiremock.client.WireMock; import com.github.tomakehurst.wiremock.junit.WireMockRule; /** * {@link MetadataTemplate} related unit tests. */ public class MetadataTemplateTest { /** * Wiremock */ @Rule public final WireMockRule wireMockRule = new WireMockRule(8080); /** * Unit test for {@link MetadataTemplate#getMetadataTemplate(BoxAPIConnection, String, String, String...)}. */ @Test @Category(UnitTest.class) public void testGetMetadataTemplateSendsCorrectRequest() { BoxAPIConnection api = new BoxAPIConnection(""); api.setRequestInterceptor(new RequestInterceptor() { @Override public BoxAPIResponse onRequest(BoxAPIRequest request) { Assert.assertEquals( "https://api.box.com/2.0/metadata_templates/global/properties/schema" + "?fields=displayName%2Chidden", request.getUrl().toString()); return new BoxJSONResponse() { @Override public String getJSON() { return "{\"id\": \"0\"}"; } }; } }); MetadataTemplate.getMetadataTemplate(api, "properties", "global", "displayName", "hidden"); } /** * Unit test for {@link MetadataTemplate#getMetadataTemplate(BoxAPIConnection)}. */ @Test @Category(UnitTest.class) public void testGetMetadataTemplateParseAllFieldsCorrectly() { final String templateKey = "productInfo"; final String scope = "enterprise_12345"; final String displayName = "Product Info"; final Boolean isHidden = false; final String firstFieldType = "float"; final String firstFieldKey = "skuNumber"; final String firstFieldDisplayName = "SKU Number"; final Boolean firstFieldIsHidden = false; final String secondFieldType = "enum"; final String secondFieldKey = "department"; final String secondFieldDisplayName = "Department"; final Boolean secondFieldIsHidden = false; final String secondFieldFirstOption = "Beauty"; final String secondFieldSecondOption = "Accessories"; BoxAPIConnection api = new BoxAPIConnection(""); api.setBaseURL("http://localhost:8080/"); WireMock.stubFor(WireMock.get(WireMock.urlMatching("/metadata_templates/global/properties/schema")) .willReturn(WireMock.aResponse() .withHeader("Content-Type", "application/json") .withBody("{\n" + " \"templateKey\": \"productInfo\",\n" + " \"scope\": \"enterprise_12345\",\n" + " \"displayName\": \"Product Info\",\n" + " \"hidden\": false,\n" + " \"fields\": [\n" + " {\n" + " \"type\": \"float\",\n" + " \"key\": \"skuNumber\",\n" + " \"displayName\": \"SKU Number\",\n" + " \"hidden\": false\n" + " },\n" + " {\n" + " \"type\": \"enum\",\n" + " \"key\": \"department\",\n" + " \"displayName\": \"Department\",\n" + " \"hidden\": false,\n" + " \"options\": [\n" + " {\n" + " \"key\": \"Beauty\"\n" + " },\n" + " {\n" + " \"key\": \"Accessories\"\n" + " }\n" + " ]\n" + " }\n" + " ]\n" + "}"))); MetadataTemplate template = MetadataTemplate.getMetadataTemplate(api); Assert.assertEquals(templateKey, template.getTemplateKey()); Assert.assertEquals(scope, template.getScope()); Assert.assertEquals(displayName, template.getDisplayName()); Assert.assertEquals(isHidden, template.getIsHidden()); List<MetadataTemplate.Field> templateFields = template.getFields(); Assert.assertEquals(firstFieldType, templateFields.get(0).getType()); Assert.assertEquals(firstFieldKey, templateFields.get(0).getKey()); Assert.assertEquals(firstFieldDisplayName, templateFields.get(0).getDisplayName()); Assert.assertEquals(firstFieldIsHidden, templateFields.get(0).getIsHidden()); Assert.assertEquals(secondFieldType, templateFields.get(1).getType()); Assert.assertEquals(secondFieldKey, templateFields.get(1).getKey()); Assert.assertEquals(secondFieldDisplayName, templateFields.get(1).getDisplayName()); Assert.assertEquals(secondFieldIsHidden, templateFields.get(1).getIsHidden()); Assert.assertEquals(secondFieldFirstOption, templateFields.get(1).getOptions().get(0)); Assert.assertEquals(secondFieldSecondOption, templateFields.get(1).getOptions().get(1)); } /** * Unit test for {@link MetadataTemplate#getEnterpriseMetadataTemplates(BoxAPIConnection, String...)}. */ @Test(expected = NoSuchElementException.class) @Category(UnitTest.class) public void testGetEnterpriseMetadataTemplatesSendsCorrectRequest() { BoxAPIConnection api = new BoxAPIConnection(""); api.setRequestInterceptor(new RequestInterceptor() { @Override public BoxAPIResponse onRequest(BoxAPIRequest request) { Assert.assertEquals( "https://api.box.com/2.0/metadata_templates/enterprise?fields=displayName%2Chidden&limit=100", request.getUrl().toString()); return new BoxJSONResponse() { @Override public String getJSON() { return "{\"entries\":[]}"; } }; } }); Iterator<MetadataTemplate> iterator = MetadataTemplate.getEnterpriseMetadataTemplates(api, "displayName", "hidden").iterator(); iterator.next(); } /** * Unit test for {@link MetadataTemplate#getEnterpriseMetadataTemplates(BoxAPIConnection, String...)}. */ @Test @Category(UnitTest.class) public void testGetEnterpriseMetadataTemplatesParseAllFieldsCorrectly() { final String firstEntryTemplateKey = "documentFlow"; final String firstEntryScope = "enterprise_12345"; final String firstEntryDisplayName = "Document Flow"; final Boolean firstEntryIsHidden = false; final String firstEntryFieldType = "string"; final String firstEntryFieldKey = "currentDocumentStage"; final String firstEntryFieldDisplayName = "Current Document Stage"; final Boolean firstEntryFieldIsHidden = false; final String firstEntryFieldDescription = "What stage in the process the document is in"; final String secondEntryTemplateKey = "productInfo"; final String secondEntryScope = "enterprise_12345"; final String secondEntryDisplayName = "Product Info"; final Boolean secondEntryIsHidden = false; final String secondEntryFieldType = "enum"; final String secondEntryFieldKey = "department"; final String secondEntryFieldDisplayName = "Department"; final Boolean secondEntryFieldIsHidden = false; final String secondEntryFieldFirstOption = "Beauty"; final String secondEntryFieldSecondOption = "Shoes"; final JsonObject fakeJSONResponse = JsonObject.readFrom("{\n" + " \"limit\": 100,\n" + " \"entries\": [\n" + " {\n" + " \"templateKey\": \"documentFlow\",\n" + " \"scope\": \"enterprise_12345\",\n" + " \"displayName\": \"Document Flow\",\n" + " \"hidden\": false,\n" + " \"fields\": [\n" + " {\n" + " \"type\": \"string\",\n" + " \"key\": \"currentDocumentStage\",\n" + " \"displayName\": \"Current Document Stage\",\n" + " \"hidden\": false,\n" + " \"description\": \"What stage in the process the document is in\"\n" + " }\n" + " ]\n" + " },\n" + " {\n" + " \"templateKey\": \"productInfo\",\n" + " \"scope\": \"enterprise_12345\",\n" + " \"displayName\": \"Product Info\",\n" + " \"hidden\": false,\n" + " \"fields\": [\n" + " {\n" + " \"type\": \"enum\",\n" + " \"key\": \"department\",\n" + " \"displayName\": \"Department\",\n" + " \"hidden\": false,\n" + " \"options\": [\n" + " {\n" + " \"key\": \"Beauty\"\n" + " },\n" + " {\n" + " \"key\": \"Shoes\"\n" + " }\n" + " ]\n" + " }\n" + " ]\n" + " }\n" + " ],\n" + " \"next_marker\": null,\n" + " \"prev_marker\": null\n" + "}"); BoxAPIConnection api = new BoxAPIConnection(""); api.setRequestInterceptor(JSONRequestInterceptor.respondWith(fakeJSONResponse)); Iterator<MetadataTemplate> iterator = MetadataTemplate.getEnterpriseMetadataTemplates(api).iterator(); MetadataTemplate template = iterator.next(); Assert.assertEquals(firstEntryTemplateKey, template.getTemplateKey()); Assert.assertEquals(firstEntryScope, template.getScope()); Assert.assertEquals(firstEntryDisplayName, template.getDisplayName()); Assert.assertEquals(firstEntryIsHidden, template.getIsHidden()); Assert.assertEquals(firstEntryFieldType, template.getFields().get(0).getType()); Assert.assertEquals(firstEntryFieldKey, template.getFields().get(0).getKey()); Assert.assertEquals(firstEntryFieldDisplayName, template.getFields().get(0).getDisplayName()); Assert.assertEquals(firstEntryFieldIsHidden, template.getFields().get(0).getIsHidden()); Assert.assertEquals(firstEntryFieldDescription, template.getFields().get(0).getDescription()); template = iterator.next(); Assert.assertEquals(secondEntryTemplateKey, template.getTemplateKey()); Assert.assertEquals(secondEntryScope, template.getScope()); Assert.assertEquals(secondEntryDisplayName, template.getDisplayName()); Assert.assertEquals(secondEntryIsHidden, template.getIsHidden()); Assert.assertEquals(secondEntryFieldType, template.getFields().get(0).getType()); Assert.assertEquals(secondEntryFieldKey, template.getFields().get(0).getKey()); Assert.assertEquals(secondEntryFieldDisplayName, template.getFields().get(0).getDisplayName()); Assert.assertEquals(secondEntryFieldIsHidden, template.getFields().get(0).getIsHidden()); Assert.assertEquals(secondEntryFieldFirstOption, template.getFields().get(0).getOptions().get(0)); Assert.assertEquals(secondEntryFieldSecondOption, template.getFields().get(0).getOptions().get(1)); Assert.assertFalse(iterator.hasNext()); } @Test @Category(IntegrationTest.class) public void createMetadataTemplateSucceeds() { BoxAPIConnection api = new BoxAPIConnection(TestConfig.getAccessToken()); MetadataTemplate.Field ctField = new MetadataTemplate.Field(); ctField.setType("string"); ctField.setKey("customerTeam"); ctField.setDisplayName("Customer Team"); MetadataTemplate.Field fyField = new MetadataTemplate.Field(); fyField.setType("enum"); fyField.setKey("fy"); fyField.setDisplayName("FY"); List<String> options = new ArrayList<String>(); options.add("FY16"); options.add("FY17"); fyField.setOptions(options); List<MetadataTemplate.Field> fields = new ArrayList<MetadataTemplate.Field>(); fields.add(ctField); fields.add(fyField); try { MetadataTemplate template = MetadataTemplate.createMetadataTemplate(api, "enterprise", "documentFlow03", "Document Flow 03", false, fields); } catch (BoxAPIException apiEx) { //Delete MetadataTemplate is yet to be supported. Due to that template might be existing already. //This expects the conflict error. To check the MetadataTemplate creation, please replace the id. Assert.assertEquals(apiEx.getResponseCode(), 409); Assert.assertTrue(apiEx.getResponse().contains("Template key already exists in this scope")); } MetadataTemplate storedTemplate = MetadataTemplate.getMetadataTemplate(api, "documentFlow03"); Assert.assertNotNull(storedTemplate); } @Test @Category(IntegrationTest.class) public void updateMetadataTemplateSucceeds() { BoxAPIConnection api = new BoxAPIConnection(TestConfig.getAccessToken()); List<MetadataTemplate.FieldOperation> fieldOperations = new ArrayList<MetadataTemplate.FieldOperation>(); MetadataTemplate.FieldOperation editField = new MetadataTemplate.FieldOperation(); editField.setOp(MetadataTemplate.Operation.editField); editField.setFieldKey("customerTeam"); MetadataTemplate.Field customerTeam = new MetadataTemplate.Field(); customerTeam.setDisplayName("Customer Team modified"); editField.setData(customerTeam); fieldOperations.add(editField); MetadataTemplate.FieldOperation newField = new MetadataTemplate.FieldOperation(); newField.setOp(MetadataTemplate.Operation.addField); MetadataTemplate.Field deptField = new MetadataTemplate.Field(); deptField.setType("enum"); deptField.setKey("department"); deptField.setDisplayName("Department"); List<String> options = new ArrayList<String>(); options.add("Beauty"); options.add("Shoes"); deptField.setOptions(options); newField.setData(deptField); fieldOperations.add(newField); try { MetadataTemplate template = MetadataTemplate.updateMetadataTemplate(api, "enterprise", "documentFlow03", fieldOperations); Assert.assertNotNull(template); } catch (BoxAPIException apiEx) { //Delete MetadataTemplate is yet to be supported. Due to that template might be existing already. //This 400 invalid request error if the field already exists. Assert.assertEquals(apiEx.getResponseCode(), 400); } MetadataTemplate updatedTemplate = MetadataTemplate.getMetadataTemplate(api, "documentFlow03"); List<MetadataTemplate.Field> fields = updatedTemplate.getFields(); boolean found = false; for (MetadataTemplate.Field field: fields) { if ("department".equals(field.getKey())) { Assert.assertEquals("enum", field.getType()); Assert.assertEquals("Department", field.getDisplayName()); Assert.assertEquals(2, field.getOptions().size()); found = true; } } Assert.assertEquals(found, true); } @Test @Category(IntegrationTest.class) public void getAllMetadataSucceeds() { BoxAPIConnection api = new BoxAPIConnection(TestConfig.getAccessToken()); BoxFolder rootFolder = BoxFolder.getRootFolder(api); String fileName = "[getAllMetadataSucceeds] Test File.txt"; byte[] fileBytes = "Non-empty string".getBytes(StandardCharsets.UTF_8); InputStream uploadStream = new ByteArrayInputStream(fileBytes); BoxFile uploadedFile = rootFolder.uploadFile(uploadStream, fileName).getResource(); uploadedFile.createMetadata(new Metadata().add("/firstName", "John").add("/lastName", "Smith")); Metadata check1 = uploadedFile.getMetadata(); Assert.assertNotNull(check1); Assert.assertEquals("John", check1.get("/firstName")); Assert.assertEquals("Smith", check1.get("/lastName")); MetadataTemplate.Field ctField = new MetadataTemplate.Field(); ctField.setType("string"); ctField.setKey("customerTeam"); ctField.setDisplayName("Customer Team"); MetadataTemplate.Field fyField = new MetadataTemplate.Field(); fyField.setType("enum"); fyField.setKey("fy"); fyField.setDisplayName("FY"); List<String> options = new ArrayList<String>(); options.add("FY16"); options.add("FY17"); fyField.setOptions(options); List<MetadataTemplate.Field> fields = new ArrayList<MetadataTemplate.Field>(); fields.add(ctField); fields.add(fyField); try { MetadataTemplate template = MetadataTemplate.createMetadataTemplate(api, "enterprise", "documentFlow03", "Document Flow 03", false, fields); } catch (BoxAPIException apiEx) { //Delete MetadataTemplate is yet to be supported. Due to that template might be existing already. //This expects the conflict error. Assert.assertEquals(apiEx.getResponseCode(), 409); Assert.assertTrue(apiEx.getResponse().contains("Template key already exists in this scope")); } MetadataTemplate storedTemplate = MetadataTemplate.getMetadataTemplate(api, "documentFlow03"); Assert.assertNotNull(storedTemplate); Metadata customerMetaData = new Metadata(); customerMetaData.add("/customerTeam", "MyTeam"); customerMetaData.add("/fy", "FY17"); uploadedFile.createMetadata("documentFlow03", "enterprise", customerMetaData); Iterable<Metadata> allMetadata = uploadedFile.getAllMetadata("/firstName", "/lastName"); Assert.assertNotNull(allMetadata); Iterator<Metadata> iter = allMetadata.iterator(); int numTemplates = 0; while (iter.hasNext()) { Metadata metadata = iter.next(); numTemplates++; if (metadata.getTemplateName().equals("properties")) { Assert.assertEquals(metadata.get("/firstName"), "John"); Assert.assertEquals(metadata.get("/lastName"), "Smith"); } if (metadata.getTemplateName().equals("documentFlow03")) { Assert.assertEquals(metadata.get("/customerTeam"), "MyTeam"); Assert.assertEquals(metadata.get("/fy"), "FY17"); } } Assert.assertEquals(numTemplates, 2); uploadedFile.delete(); } }