package dw.xmlrpc.itest;
import static org.junit.Assert.*;
import static junitx.framework.FileAssert.assertBinaryEquals;
import java.io.File;
import java.net.MalformedURLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import dw.xmlrpc.AttachmentDetails;
import dw.xmlrpc.AttachmentInfo;
import dw.xmlrpc.DokuJClient;
import dw.xmlrpc.MediaChange;
import dw.xmlrpc.exception.DokuAttachmentUploadException;
import dw.xmlrpc.exception.DokuException;
@RunWith(value = Parameterized.class)
public class Test_Attacher extends TestHelper {
private DokuJClient _client;
private String _localDownloadedFile = "tempFileForTests.gif";
Set<String> _uploadedFiles;
public Test_Attacher(TestParams params) throws MalformedURLException, DokuException {
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
_client = new DokuJClient(params.url, TestParams.user, TestParams.password);
_uploadedFiles = new HashSet<String>();
clean();
}
@Parameters
public static Collection<Object[]> data() {
return TestParams.data();
}
@org.junit.After
public void clean(){
File f = new File(_localDownloadedFile);
f.delete();
for ( String fileId : _uploadedFiles ){
tryToDeleteDistantFile(fileId);
}
}
private void tryToDeleteDistantFile(String fileId){
try {
_client.deleteAttachment(fileId);
} catch ( Exception e ){
//Too bad we missed one... We'll live with it
System.out.println("Failed to delete distant attachment " + fileId + " during tear down");
}
}
@org.junit.Test
public void getAttachmentsUseParameters() throws Exception{
//Set up environment
_uploadedFiles.add("nswithanotherns:img1.gif");
_uploadedFiles.add("ns2:img2.gif");
_uploadedFiles.add("nswithanotherns:img3.gif");
_uploadedFiles.add("nswithanotherns:img33.gif");
_uploadedFiles.add("nswithanotherns:otherns:img4.gif");
for ( String fileId : _uploadedFiles ){
_client.putAttachment(fileId, TestParams.localFileToUpload, true);
}
//actually test
//Filtering on a PREG
Map<String, Object> params = new HashMap<String, Object>();
params.put("pattern", "/3.gif/");
testGetAttachmentWithParams(params, 2);
//without special parameters
params = new HashMap<String, Object>();
testGetAttachmentWithParams(params, 4);
//Limiting max depth
params = new HashMap<String, Object>();
params.put("depth", 1);
testGetAttachmentWithParams(params, 3);
}
private void testGetAttachmentWithParams(Map<String, Object> params, int nbExpectedAttachments) throws DokuException{
List<AttachmentDetails> res = _client.getAttachments("nswithanotherns", params);
assertEquals(nbExpectedAttachments, res.size());
}
@org.junit.Test
public void getAttachmentsReturnsCorrectStructure() throws Exception {
List<AttachmentDetails> res = _client.getAttachments("ro_for_tests");
assertEquals(1, res.size());
AttachmentDetails details = res.get(0);
assertEquals("ro_for_tests:img1.gif", details.id());
assertEquals((Integer) 67, details.size());
//TODO: study timezones more in depth to strengthen this assertion
assertNotNull(details.lastModified());
assertEquals(true, details.isImg());
assertEquals(true, details.writable());
assertEquals((Integer) 255, details.perms());
assertEquals("img1.gif", details.file());
assertEquals((Integer) 1356379860, details.mtime());
}
@org.junit.Test
public void getRecentMediaChanges() throws Exception{
List<MediaChange> changes = _client.getRecentMediaChanges(1356383400);
String mediaId = "ro_for_tests:img1.gif";
MediaChange change = findOneMediaChange(changes, mediaId);
assertEquals(mediaId, change.id());
assertDatesNear(2012, 11, 24, 21, 11, 0, change.lastModified());
assertEquals("fifi", change.author());
assertEquals((Integer) 1356383460, change.version());
assertEquals((Integer) 255, change.perms());
assertEquals((Integer) 67, change.size());
}
@org.junit.Test
public void getRecentMediaChangesRespectMaxTimestamp() throws Exception {
String oldMediaChange = "ro_for_tests:img1.gif";
String recentMediaChange = "ro_for_tests:img2.gif";
List<MediaChange> changes = _client.getRecentMediaChanges(1356383400);
assertNotNull(findOneMediaChange(changes,oldMediaChange));
assertNotNull(findOneMediaChange(changes, recentMediaChange));
changes = _client.getRecentMediaChanges(1356383461);
assertNull(findOneMediaChange(changes,oldMediaChange));
assertNotNull(findOneMediaChange(changes, recentMediaChange));
}
@org.junit.Test
public void getRecentMediaChangesRespectMaxDate() throws Exception {
String oldMediaChange = "ro_for_tests:img1.gif";
String recentMediaChange = "ro_for_tests:img2.gif";
List<MediaChange> changes = _client.getRecentMediaChanges(buildDate(2012, 11, 24, 21, 10, 59));
assertNotNull(findOneMediaChange(changes,oldMediaChange));
assertNotNull(findOneMediaChange(changes, recentMediaChange));
changes = _client.getRecentMediaChanges(buildDate(2012, 11, 24, 21, 11, 1));
assertNull(findOneMediaChange(changes,oldMediaChange));
assertNotNull(findOneMediaChange(changes, recentMediaChange));
}
private MediaChange findOneMediaChange(List<MediaChange> changes, String mediaId){
MediaChange res = null;
boolean foundOne = false;
for(MediaChange change : changes){
if ( change.id().equals(mediaId) ){
if ( foundOne ){
fail("Found two media changes for the same mediaId " + mediaId);
}
foundOne = true;
res = change;
}
}
return res;
}
@org.junit.Test
public void putGetAndDeleteAttachment() throws Exception{
String fileId = "ns1:img2.gif";
File file = new File(TestParams.localFileToUpload);
_client.putAttachment(fileId, file, true);
AttachmentInfo info = _client.getAttachmentInfo(fileId);
assertEquals((Integer)(int) file.length(), info.size());
File fileRetrieved = _client.getAttachment(fileId, _localDownloadedFile);
assertTrue(fileRetrieved.exists());
assertEquals(file.length(), fileRetrieved.length());
_client.deleteAttachment(fileId);
info = _client.getAttachmentInfo(fileId);
assertEquals((Integer)0, info.size());
}
@org.junit.Test
public void putWithoutOverwritingShouldPutOnlyIfTheresNoFileYet() throws Exception {
String fileId = "ns1:img2.gif";
File file1 = new File(TestParams.localFileToUpload);
File file2 = new File(TestParams.localFile2ToUpload);
_client.putAttachment(fileId, file1, true);
assertBinaryEquals(file1, _client.getAttachment(fileId, _localDownloadedFile));
boolean expectedExceptionCaught = false;
try {
_client.putAttachment(fileId, file2, false);
} catch (DokuAttachmentUploadException e){
expectedExceptionCaught = true;
}
assertTrue(expectedExceptionCaught);
assertBinaryEquals(file1, _client.getAttachment(fileId, _localDownloadedFile));
}
@org.junit.Test
public void putWithOverwritingShouldAlwaysSucceed() throws Exception {
String fileId = "ns1:img2.gif";
File file1 = new File(TestParams.localFileToUpload);
File file2 = new File(TestParams.localFile2ToUpload);
_client.putAttachment(fileId, file1, true);
assertBinaryEquals(file1, _client.getAttachment(fileId, _localDownloadedFile));
_client.putAttachment(fileId, file2, true);
assertBinaryEquals(file2, _client.getAttachment(fileId, _localDownloadedFile));
}
@org.junit.Test
public void getAttachmentInfo() throws Exception {
String id = "ro_for_tests:img1.gif";
AttachmentInfo info = _client.getAttachmentInfo(id);
assertEquals(id, info.id());
assertEquals((Integer) 67, info.size());
//TODO: enforce this test once we've clarify how to deal with timezone
assertNotNull(info.lastModified());
}
}