aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/test/java/mygram/droid/LogicTest.java
blob: e8077257ab9c9fbb9a7510f868973e6189c4f2b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
 * mygram-droid: Android TV client for Foldergram.
 * Copyright (C) 2026 Danilo M. <danix@danix.xyz>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published
 * by the Free Software Foundation.
 *
 * 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 General Public License
 * for more details.
 */


package mygram.droid;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import org.json.JSONObject;
import org.junit.Test;

import java.util.List;

public class LogicTest {
	private static final String BASE = "http://192.0.2.10:4141";

	@Test
	public void parsesSinglePhoto() throws Exception {
		Post p = new Post(new JSONObject("{\"id\":7,\"folderSlug\":\"trips\",\"folderName\":\"Trips\","
				+ "\"mediaType\":\"image\",\"width\":1080,\"height\":1920,\"durationMs\":null,"
				+ "\"thumbnailUrl\":\"/thumbnails/ab/x.webp?v=1\",\"previewUrl\":\"/previews/ab/x.webp?v=1\","
				+ "\"postType\":\"single\",\"itemCount\":1}"), BASE);
		assertEquals(7, p.id);
		assertEquals("trips", p.folderSlug);
		assertEquals(1, p.media.size());
		Post.Media m = p.media.get(0);
		assertFalse(m.video);
		assertEquals(0, m.durationMs);
		assertEquals(1080, m.width);
		assertEquals(BASE + "/thumbnails/ab/x.webp?v=1", m.thumbnailUrl);
		assertEquals(BASE + "/previews/ab/x.webp?v=1", m.previewUrl);
	}

	@Test
	public void parsesVideo() throws Exception {
		Post p = new Post(new JSONObject("{\"id\":8,\"mediaType\":\"video\",\"durationMs\":41633,"
				+ "\"thumbnailUrl\":\"/thumbnails/cd/y.webp\",\"previewUrl\":\"/previews/cd/y.mp4\"}"), BASE);
		Post.Media m = p.media.get(0);
		assertTrue(m.video);
		assertEquals(41633, m.durationMs);
		assertEquals(BASE + "/previews/cd/y.mp4", m.previewUrl);
	}

	@Test
	public void parsesCarouselSlidesInOrder() throws Exception {
		Post p = new Post(new JSONObject("{\"id\":9,\"mediaType\":\"image\",\"postType\":\"carousel\","
				+ "\"thumbnailUrl\":\"/thumbnails/a.webp\",\"previewUrl\":\"/previews/a.webp\",\"mediaItems\":["
				+ "{\"imageId\":1,\"mediaType\":\"image\",\"thumbnailUrl\":\"/thumbnails/a.webp\",\"previewUrl\":\"/previews/a.webp\"},"
				+ "{\"imageId\":2,\"mediaType\":\"video\",\"durationMs\":5000,\"thumbnailUrl\":\"/thumbnails/b.webp\",\"previewUrl\":\"/previews/b.mp4\"}]}"),
				BASE);
		assertEquals(2, p.media.size());
		assertFalse(p.media.get(0).video);
		assertTrue(p.media.get(1).video);
		assertEquals(BASE + "/previews/b.mp4", p.media.get(1).previewUrl);
	}

	@Test
	public void parsesPageAndNullUrl() throws Exception {
		List<Post> posts = Post.list(new JSONObject("{\"items\":[{\"id\":1,\"mediaType\":\"image\","
				+ "\"thumbnailUrl\":null,\"previewUrl\":\"/previews/z.webp\"}],\"hasMore\":false}"), BASE);
		assertEquals(1, posts.size());
		assertNull(posts.get(0).media.get(0).thumbnailUrl);
		assertEquals(0, Post.list(new JSONObject("{}"), BASE).size());
	}

	@Test
	public void normalizesServerUrls() {
		assertEquals("http://192.0.2.10:4141", Api.normalize(" 192.0.2.10:4141/ "));
		assertEquals("http://foldergram.example.org:4141", Api.normalize("http://foldergram.example.org:4141//"));
		assertEquals("https://foldergram.example.org", Api.normalize("https://foldergram.example.org"));
	}

	@Test
	public void resolvesMediaPaths() {
		assertEquals(BASE + "/icon-192.png", Api.resolve(BASE, "/icon-192.png"));
		assertNull(Api.resolve(BASE, null));
	}

	@Test
	public void detectsFoldergramHealth() {
		assertTrue(Discovery.isFoldergram("{\"ok\":true,\"timestamp\":\"t\",\"storage\":{\"available\":true}}"));
		assertFalse(Discovery.isFoldergram("{\"ok\":true}"));
		assertFalse(Discovery.isFoldergram("{\"ok\":false,\"storage\":{}}"));
		assertFalse(Discovery.isFoldergram("<html>router login</html>"));
	}

	@Test
	public void tellsDoublePressFromSingle() {
		DoubleOk d = new DoubleOk();
		assertFalse(d.press(1000));
		assertTrue(d.press(1250));
		assertFalse("a double press resets", d.press(1400));
		assertFalse(d.press(2000));
		assertFalse("301 ms is too slow", d.press(2301));
	}
}