package org.geogebra.cloud; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.geogebra.common.move.ggtapi.events.LoginEvent; import org.geogebra.common.move.ggtapi.models.AuthenticationModel; import org.geogebra.common.move.ggtapi.models.Chapter; import org.geogebra.common.move.ggtapi.models.ClientInfo; import org.geogebra.common.move.ggtapi.models.GeoGebraTubeUser; import org.geogebra.common.move.ggtapi.models.Material; import org.geogebra.common.move.ggtapi.models.Material.MaterialType; import org.geogebra.common.move.ggtapi.models.SyncEvent; import org.geogebra.common.move.ggtapi.operations.LogInOperation; import org.geogebra.common.move.ggtapi.requests.MaterialCallbackI; import org.geogebra.common.move.ggtapi.requests.SyncCallback; import org.geogebra.common.util.debug.Log; import org.geogebra.desktop.main.AppDNoGui; import org.geogebra.desktop.main.LocalizationD; import org.geogebra.desktop.move.ggtapi.models.AuthenticationModelD; import org.geogebra.desktop.move.ggtapi.models.GeoGebraTubeAPID; import org.geogebra.desktop.util.LoggerD; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class TubeAPITest extends Assert { public static final String circleBase64 = "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"; @BeforeClass() public static void startLogging() { Log.setLogger(new LoggerD()); } @Test public void testSearch() { GeoGebraTubeAPID api = new GeoGebraTubeAPID(true, getClient()); final ArrayList<String> titles = new ArrayList<String>(); api.search("pythagoras", new MaterialCallbackI() { @Override public void onLoaded(List<Material> result, ArrayList<Chapter> meta) { for (Material m : result) { titles.add(m.getTitle()); } } @Override public void onError(Throwable exception) { exception.printStackTrace(); } }); for (int i = 0; i < 20 && titles.size() < 30; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } assertEquals("Wrong number of search results", 30, titles.size()); } @Test /** * Upload a simple file as new file */ public void testUpload() { GeoGebraTubeAPID api = new GeoGebraTubeAPID(true, getAuthClient(null)); final ArrayList<String> titles = new ArrayList<String>(); uploadMaterial(api, titles, 0, null); for (int i = 0; i < 20 && titles.size() < 1; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } assertEquals("Wrong number of upload results", 1, titles.size()); assertFalse("Wrong upload result: " + titles.get(0), titles.get(0).contains("FAIL")); } @Test public void testReupload() { final GeoGebraTubeAPID api = new GeoGebraTubeAPID(true, getAuthClient(null)); final ArrayList<String> titles = new ArrayList<String>(); uploadMaterial(api, titles, 0, new IdCallback() { public void handle(int id) { uploadMaterial(api, titles, id, null); } }); for (int i = 0; i < 20 && titles.size() < 2; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } assertEquals("Wrong number of upload results", 2, titles.size()); assertFalse("Wrong upload result: " + titles.get(0), titles.get(0).contains("FAIL")); } private void uploadMaterial(GeoGebraTubeAPID api, final ArrayList<String> titles, int id, final IdCallback callback) { api.uploadMaterial(id, "O", "testfile" + new Date() + Math.random(), circleBase64, new MaterialCallbackI() { public void onLoaded(List<Material> result, ArrayList<Chapter> meta) { if (result.size() > 0) { for (Material m : result) { titles.add(m.getTitle()); if (callback != null) { callback.handle(m.getId()); } } } else { titles.add("FAIL " + result.size()); } } public void onError(Throwable exception) { exception.printStackTrace(); Assert.assertNull(exception.getMessage()); } }, MaterialType.ggb); } /** * Upload one material and delete all materials in account. */ @Test public void testDelete() { testUpload();// ensure we have st to delete final GeoGebraTubeAPID api = new GeoGebraTubeAPID(true, getAuthClient(null)); final ArrayList<String> titles = new ArrayList<String>(); api.getUsersOwnMaterials(new MaterialCallbackI() { public void onLoaded(List<Material> result, ArrayList<Chapter> meta) { System.out.println(result.size()); for (Material m : result) { final Material mFinal = m; api.deleteMaterial(m, new MaterialCallbackI() { public void onLoaded(List<Material> result1, ArrayList<Chapter> meta1) { titles.add(mFinal.getTitle()); } public void onError(Throwable exception) { // TODO Auto-generated method stub } }); // titles.add(m.getTitle()); } } public void onError(Throwable exception) { exception.printStackTrace(); Assert.assertNull(exception.getMessage()); } }); for (int i = 0; i < 20 && titles.size() < 1; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } assertTrue("Wrong number of deleted results", titles.size() > 0); assertFalse("Wrong upload result: " + titles.get(0), titles.get(0).contains("FAIL")); } @Test public void testSync() { AppDNoGui app = new AppDNoGui(new LocalizationD(3), false); final ClientInfo client = getAuthClient(app.getLoginOperation()); app.getLoginOperation().getGeoGebraTubeAPI().setClient(client); final TestMaterialsManager man = new TestMaterialsManager( app); Material mat = new Material(0, MaterialType.ggb); mat.setTitle("test-sync-" + new Date() + Math.random()); mat.setBase64(circleBase64); mat.setLanguage("en"); man.insertFile(mat); app.getLoginOperation().getGeoGebraTubeAPI().sync(0, new SyncCallback() { public void onSync(ArrayList<SyncEvent> events) { man.uploadUsersMaterials(events); } }); for (int i = 0; i < 20; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private static ClientInfo getClient() { ClientInfo client = new ClientInfo(); // client.setModel((AuthenticationModel) this.model); client.setType("desktop"); client.setId("APITEST"); client.setWidth(1024); client.setWidth(768); client.setLanguage("en"); return client; } private static ClientInfo getAuthClient(LogInOperation op) { ClientInfo client = getClient(); AuthenticationModel auth = op != null ? op.getModel() : new AuthenticationModelD(); Assert.assertNotNull("Token must be stored as materials.token", System.getProperty("materials.token")); GeoGebraTubeUser user = new GeoGebraTubeUser( System.getProperty("materials.token")); user.setUserId(4951854); auth.onEvent(new LoginEvent(user, true, true, "{}")); client.setModel(auth); return client; } }