/*
* Catroid: An on-device visual programming system for Android devices
* Copyright (C) 2010-2017 The Catrobat Team
* (<http://developer.catrobat.org/credits>)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* An additional term exception under section 7 of the GNU Affero
* General Public License, version 3, is available at
* http://developer.catrobat.org/license_additional_term
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.catrobat.catroid.test.scratchconverter;
import android.test.InstrumentationTestCase;
import org.catrobat.catroid.common.Constants;
import org.catrobat.catroid.common.ScratchProgramData;
import org.catrobat.catroid.common.ScratchSearchResult;
import org.catrobat.catroid.test.utils.TestUtils;
import org.catrobat.catroid.web.ServerCalls;
import org.catrobat.catroid.web.WebScratchProgramException;
import org.catrobat.catroid.web.WebconnectionException;
import java.io.InterruptedIOException;
import java.util.List;
import java.util.Locale;
/*
* These tests need an internet connection
*/
public class ScratchServerCallsTest extends InstrumentationTestCase {
public ScratchServerCallsTest() {
super();
}
@Override
protected void setUp() throws Exception {
super.setUp();
ServerCalls.useTestUrl = true;
}
@Override
protected void tearDown() throws Exception {
TestUtils.deleteTestProjects("uploadtestProject");
ServerCalls.useTestUrl = false;
super.tearDown();
}
public void testScratchSearchWithEmptyQueryParam() {
try {
ScratchSearchResult searchResult = ServerCalls.getInstance().scratchSearch("", 20, 0);
List<ScratchProgramData> programDataList = searchResult.getProgramDataList();
assertNotNull("Invalid search result", programDataList);
assertTrue("Empty query should to no results!", programDataList.size() == 0);
assertNotNull("No search result returned", searchResult);
assertTrue("Wrong page number", searchResult.getPageNumber() == 0);
} catch (InterruptedIOException e) {
fail("Task has been interrupted/cancelled! This should not happen here!");
} catch (WebconnectionException e) {
fail("WebconnectionException:\nstatus code:" + e.getStatusCode()
+ "\nmessage: " + e.getLocalizedMessage());
}
}
private void checkScratchProgramData(ScratchProgramData programData) {
assertTrue("Invalid program ID", programData.getId() > 0);
assertNotNull("Invalid program title", programData.getTitle());
assertTrue("Invalid program title", programData.getTitle().length() > 0);
assertNotNull("Program has invalid owner", programData.getOwner());
assertTrue("Program has invalid owner", programData.getOwner().length() > 0);
assertNotNull("Program has invalid notes & credits description", programData.getNotesAndCredits());
assertNotNull("Program has invalid instructions-description", programData.getInstructions());
assertNotNull("Program contains no screenshot-image URL", programData.getImage());
assertNotNull("Program contains no screenshot-image URL", programData.getImage().getUrl());
final String urlString = programData.getImage().getUrl().toString();
assertTrue("Screenshot-image URL '" + urlString + "' does not start with base URL '"
+ Constants.SCRATCH_IMAGE_BASE_URL + "' any more: " + Constants.SCRATCH_IMAGE_BASE_URL,
urlString.startsWith(Constants.SCRATCH_IMAGE_BASE_URL));
final int[] imageSize = new int[] { Constants.SCRATCH_IMAGE_DEFAULT_WIDTH, Constants.SCRATCH_IMAGE_DEFAULT_HEIGHT };
assertTrue("Invalid width extracated of image URL", programData.getImage().getWidth() == imageSize[0]);
assertTrue("Invalid height extracted from image URL", programData.getImage().getHeight() == imageSize[1]);
final String imageURLWithoutQuery = programData.getImage().getUrl().toString().split("\\?")[0];
final String expectedImageURLWithoutQuery = String.format(Locale.getDefault(), "%s%d.png",
Constants.SCRATCH_IMAGE_BASE_URL, programData.getId());
assertEquals("Image URL is corrupt!", expectedImageURLWithoutQuery, imageURLWithoutQuery);
assertNotNull("Program has no modified date", programData.getModifiedDate());
assertNotNull("Program has no shared date", programData.getSharedDate());
assertTrue("View-counter-value of program is invalid", programData.getViews() >= 0);
assertTrue("Love-counter-value of program is invalid", programData.getLoves() >= 0);
assertTrue("Favorites-counter-value of program is invalid", programData.getFavorites() >= 0);
}
public void testScratchSearchWithQueryParam() {
try {
ScratchSearchResult searchResult = ServerCalls.getInstance().scratchSearch("test", 20, 0);
List<ScratchProgramData> programDataList = searchResult.getProgramDataList();
assertNotNull("Invalid search result", searchResult);
assertNotNull("Invalid search result", programDataList);
assertTrue("WTH?? No search results returned!", programDataList.size() > 0);
assertTrue("Wrong page number", searchResult.getPageNumber() == 0);
assertTrue("No projects found!", searchResult.getProgramDataList().size() > 0);
assertTrue("Search result is too big...", searchResult.getProgramDataList().size() <= 20);
for (ScratchProgramData programData : programDataList) {
checkScratchProgramData(programData);
}
} catch (InterruptedIOException e) {
fail("Task has been interrupted/cancelled! This should not happen here!");
} catch (WebconnectionException e) {
fail("WebconnectionException:\nstatus code:" + e.getStatusCode()
+ "\nmessage: " + e.getLocalizedMessage());
}
}
public void testScratchSearchMaxNumberOfItemsParam() {
try {
final int maxNumberOfItems = 10;
ScratchSearchResult searchResult = ServerCalls.getInstance().scratchSearch("test", maxNumberOfItems, 0);
List<ScratchProgramData> programDataList = searchResult.getProgramDataList();
assertNotNull("Invalid search result", searchResult);
assertNotNull("Invalid search result", programDataList);
assertTrue("WTH?? No search results returned!", programDataList.size() > 0);
assertTrue("Wrong page number", searchResult.getPageNumber() == 0);
assertTrue("No projects found!", searchResult.getProgramDataList().size() > 0);
assertTrue("Search result is too big...", searchResult.getProgramDataList().size() <= maxNumberOfItems);
for (ScratchProgramData programData : programDataList) {
checkScratchProgramData(programData);
}
} catch (InterruptedIOException e) {
fail("Task has been interrupted/cancelled! This should not happen here!");
} catch (WebconnectionException e) {
fail("WebconnectionException:\nstatus code:" + e.getStatusCode()
+ "\nmessage: " + e.getLocalizedMessage());
}
}
public void testScratchSearchPagination() {
try {
for (int pageIndex = 1; pageIndex < 3; pageIndex++) {
ScratchSearchResult searchResult = ServerCalls.getInstance().scratchSearch("test", 20, pageIndex);
List<ScratchProgramData> programDataList = searchResult.getProgramDataList();
assertNotNull("Invalid search result", searchResult);
assertNotNull("Invalid search result", programDataList);
assertTrue("WTH?? No search results returned!", programDataList.size() > 0);
assertTrue("Wrong page number", searchResult.getPageNumber() == pageIndex);
assertTrue("No projects found!", searchResult.getProgramDataList().size() > 0);
assertTrue("Search result is too big...", searchResult.getProgramDataList().size() <= 20);
for (ScratchProgramData programData : programDataList) {
checkScratchProgramData(programData);
}
}
} catch (InterruptedIOException e) {
fail("Task has been interrupted/cancelled! This should not happen here!");
} catch (WebconnectionException e) {
fail("WebconnectionException:\nstatus code:" + e.getStatusCode()
+ "\nmessage: " + e.getLocalizedMessage());
}
}
public void testFetchDefaultScratchPrograms() {
try {
ScratchSearchResult searchResult = ServerCalls.getInstance().fetchDefaultScratchPrograms();
List<ScratchProgramData> programDataList = searchResult.getProgramDataList();
assertNotNull("Invalid search result", searchResult);
assertNotNull("Invalid search result", programDataList);
assertTrue("WTH?? No search results returned!", programDataList.size() > 0);
assertTrue("Wrong page number", searchResult.getPageNumber() == 0);
assertTrue("No projects found!", searchResult.getProgramDataList().size() > 0);
for (ScratchProgramData programData : programDataList) {
checkScratchProgramData(programData);
}
} catch (InterruptedIOException e) {
fail("Task has been interrupted/cancelled! This should not happen here!");
} catch (WebconnectionException e) {
fail("WebconnectionException:\nstatus code:" + e.getStatusCode()
+ "\nmessage: " + e.getLocalizedMessage());
}
}
public void testFetchScratchProgramDetails() {
try {
final long expectedProgramID = 10205819;
final String expectedProgramTitle = "Dancin' in the Castle";
final String expectedProgramOwner = "jschombs";
ScratchProgramData programData = ServerCalls.getInstance().fetchScratchProgramDetails(expectedProgramID);
checkScratchProgramData(programData);
assertEquals("Invalid program ID", programData.getId(), expectedProgramID);
assertEquals("Wrong program title?! Maybe the program owner changed the program title...",
programData.getTitle(), expectedProgramTitle);
assertEquals("Program has invalid owner", programData.getOwner(), expectedProgramOwner);
} catch (InterruptedIOException e) {
fail("Task has been interrupted/cancelled! This should not happen here!");
} catch (WebconnectionException e) {
fail("WebconnectionException:\nstatus code:" + e.getStatusCode()
+ "\nmessage: " + e.getLocalizedMessage());
} catch (WebScratchProgramException e) {
fail("WebconnectionException:\nstatus code:" + e.getStatusCode()
+ "\nmessage: " + e.getLocalizedMessage());
}
}
}