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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/*
* 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));
}
@Test
public void validatesPins() {
assertTrue(Prefs.validPin("1234"));
assertTrue(Prefs.validPin("12345678"));
assertFalse(Prefs.validPin("123"));
assertFalse(Prefs.validPin("123456789"));
assertFalse(Prefs.validPin("12a4"));
assertFalse(Prefs.validPin(""));
}
@Test
public void hashesPinsWithSalt() {
String h = Prefs.hash("00ff", "1234");
assertEquals(64, h.length());
assertEquals(h, Prefs.hash("00ff", "1234"));
assertFalse(h.equals(Prefs.hash("00fe", "1234")));
assertFalse(h.equals(Prefs.hash("00ff", "1235")));
}
}
|