/*
* Copyright 2015 Trento Rise.
*
* Licensed 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 eu.trentorise.opendata.jackan.test.ckan;
import static eu.trentorise.opendata.commons.validation.Preconditions.checkNotEmpty;
import eu.trentorise.opendata.jackan.exceptions.JackanException;
import eu.trentorise.opendata.jackan.model.CkanDataset;
import eu.trentorise.opendata.jackan.model.CkanResource;
import eu.trentorise.opendata.jackan.model.CkanResourceBase;
import eu.trentorise.opendata.jackan.model.CkanState;
import eu.trentorise.opendata.jackan.test.JackanTestConfig;
import static eu.trentorise.opendata.jackan.test.ckan.ReadCkanIT.PRODOTTI_CERTIFICATI_RESOURCE_ID;
import static eu.trentorise.opendata.jackan.test.ckan.WriteCkanTest.JACKAN_URL;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import junitparams.Parameters;
import org.junit.Assert;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
/**
*
* @author David Leoni
* @since 0.4.1
*/
public class WriteCkanResourceIT extends WriteCkanTest {
private static final Logger LOG = Logger.getLogger(WriteCkanResourceIT.class.getName());
@Test
public void testCreateMinimal() {
CkanDataset dataset = createRandomDataset();
CkanResourceBase resource = new CkanResourceBase(JACKAN_URL, dataset.getId());
CkanResource retRes = client.createResource(resource);
checkNotEmpty(retRes.getId(), "Invalid created resource id!");
assertEquals(resource.getUrl(), retRes.getUrl());
assertEquals(null, retRes.getPackageId()); // because this won't be present in the result
LOG.log(Level.INFO, "Created resource with id {0} in catalog {1}", new Object[]{retRes.getId(), JackanTestConfig.of().getOutputCkan()});
}
@Test
public void testCreate() {
CkanDataset dataset = createRandomDataset();
CkanResourceBase resource = new CkanResourceBase(JACKAN_URL, dataset.getId());
resource.putOthers("x", "y");
CkanResource retRes = client.createResource(resource);
checkNotEmpty(retRes.getId(), "Invalid created resource id!");
assertEquals(resource.getUrl(), retRes.getUrl());
assertEquals(null, retRes.getPackageId()); // because this won't be present in the result
assertEquals(resource.getOthers(), retRes.getOthers());
LOG.log(Level.INFO, "Created resource with id {0} in catalog {1}", new Object[]{retRes.getId(), JackanTestConfig.of().getOutputCkan()});
}
/**
* Shows it's possible to force an id in a resource.
*/
@Test
public void testCreateWithId() {
CkanDataset dataset = createRandomDataset();
CkanResourceBase resource = new CkanResourceBase(JACKAN_URL, dataset.getId());
resource.setId(UUID.randomUUID().toString());
CkanResource retRes = client.createResource(resource);
assertEquals(resource.getId(), retRes.getId());
}
@Test
@Parameters(method = "wrongIds")
public void testCreateWithWrongId(String wrongId) {
CkanDataset dataset = createRandomDataset();
CkanResourceBase resource = new CkanResourceBase(JACKAN_URL, dataset.getId());
resource.setId(wrongId);
try {
CkanResource retRes = client.createResource(resource);
Assert.fail("Shouldn't be able to create resource with ill formatted UUID '" + resource.getId() + "'");
}
catch (JackanException ex) {
}
}
@Test
public void testCreateDuplicateId() {
CkanDataset dataset = createRandomDataset();
CkanResourceBase resource = new CkanResourceBase(JACKAN_URL, dataset.getId());
resource.setId(UUID.randomUUID().toString());
CkanResource retRes1 = client.createResource(resource);
try {
CkanResource retRes2 = client.createResource(resource);
LOG.log(Level.FINE, "id 1: {0}", retRes1.getId());
LOG.log(Level.FINE, "id 2: {0}", retRes2.getId());
Assert.fail("Shouldn't be able to create resource with duplicate id!");
}
catch (JackanException ex) {
}
}
@Test
@Parameters(method = "wrongUrls")
public void testCreateWithWrongUrl(String url) {
CkanDataset dataset = createRandomDataset();
try {
CkanResourceBase resource = new CkanResourceBase(url, dataset.getId());
client.createResource(resource);
Assert.fail("Shouldn't be able to create resource with wrong url: " + url);
}
catch (JackanException ex) {
}
}
@Test
public void testCreateWithWrongDatasetId() {
CkanResourceBase resource = new CkanResourceBase(JACKAN_URL, UUID.randomUUID().toString());
try {
client.createResource(resource);
Assert.fail();
}
catch (JackanException ex) {
}
}
@Test
public void testCreateMirror() {
CkanDataset dataset = createRandomDataset();
CkanResource resource = datiTrentinoClient.getResource(PRODOTTI_CERTIFICATI_RESOURCE_ID);
resource.setPackageId(dataset.getId());
resource.setId(randomUUID());
CkanResource retResource = client.createResource(resource);
checkNotEmpty(retResource.getId(), "Invalid resource id!");
LOG.log(Level.INFO, "created resource with id {0} in catalog {1}", new Object[]{retResource.getId(), JackanTestConfig.of().getOutputCkan()});
}
@Test
public void testPatchUpdate() {
CkanDataset dataset = createRandomDataset();
CkanResource resource = new CkanResource(JACKAN_URL, dataset.getId());
resource.setSize("123");
resource.setOwner("acme"); // owner is not in CkanResourceBase, shouldn't be sent in update post
resource.putOthers("x", "y");
CkanResource retRes1 = client.createResource(resource);
retRes1.setDescription("abc");
retRes1.setSize(null); // so we won't send it in the post
retRes1.setOthers(null); // so we won't send it in the post and hopefully trigger client automerge feature
CkanResource retRes2 = client.patchUpdateResource(retRes1);
assertEquals(retRes1.getId(), retRes2.getId());
assertEquals(retRes1.getUrl(), retRes2.getUrl());
assertEquals("abc", retRes2.getDescription());
assertEquals("123", retRes2.getSize());
assertEquals(resource.getOthers(), retRes2.getOthers());
assertEquals(null, retRes2.getOwner()); // owner is not among api docs for creation, so hopefully was jsonignored when sending retRes1
}
@Test
public void testPatchUpdateNonExistingResource() {
CkanDataset dataset = createRandomDataset();
CkanResourceBase resource = new CkanResourceBase(JACKAN_URL, dataset.getId());
resource.setId(randomUUID());
try {
client.patchUpdateResource(resource);
Assert.fail("Shouldn't be able to patch update non existing resource!");
}
catch (JackanException ex) {
}
}
@Test
@Parameters(method = "wrongUrls")
public void testPatchUpdatWithWrongUrl(String url) {
CkanResource resource = createRandomResource();
resource.setUrl(url);
try {
client.patchUpdateResource(resource);
Assert.fail("Shouldn't be able to patch update resource with wrong url: " + url);
}
catch (JackanException ex) {
}
}
/**
* This shows it is not possible to move a resource from one dataset to
* another by updating the resource packageId.
*/
@Test
public void testPatchUpdateWithDifferentDatasetId() {
CkanDataset dataset1 = createRandomDataset();
CkanResourceBase resource = new CkanResourceBase(JACKAN_URL, dataset1.getId());
CkanResource retResource1 = client.createResource(resource);
CkanDataset dataset2 = createRandomDataset();
resource.setPackageId(dataset2.getId());
CkanResource retResource2 = client.patchUpdateResource(retResource1);
assertEquals(null, retResource2.getPackageId());
boolean found = false;
CkanDataset newDataset1 = client.getDataset(dataset1.getId());
for (CkanResource cr : newDataset1.getResources()) {
if (retResource1.getId().equals(cr.getId())) {
found = true;
}
}
if (!found) {
Assert.fail("In theory it sbouldn't be possible to 'move' a resource from one dataset to another by updating the resource package id!");
}
}
/**
* Shows it is not possible to mark as deleted a resource by update. For
* dataset it is different, see {@link WriteCkanDatasetIT#testPatchUpdateAsDeleted()
* }
*/
@Test
public void testPatchUpdateAsDeleted() {
CkanResource resource = createRandomResource();
resource.setState(CkanState.deleted);
CkanResource retResource1 = client.patchUpdateResource(resource);
assertEquals(CkanState.active, retResource1.getState());
}
/**
* Shows resources are just marked as 'deleted', but still accessible from
* webapi.
*/
@Test
public void testDelete() {
CkanDataset dataset = createRandomDataset(1);
String resourceId = dataset.getResources().get(0).getId();
client.deleteResource(resourceId);
CkanResource retResource = client.getResource(resourceId);
assertEquals(CkanState.deleted, retResource.getState());
}
/**
* Shows resources are just marked as 'deleted', but still accessible from
* webapi.
*/
@Test
public void testDeleteNonExisting() {
String resourceId = UUID.randomUUID().toString();
try {
client.deleteResource(resourceId);
Assert.fail("Shouldn't be possible to delete non existing resource!");
}
catch (JackanException ex) {
}
}
}