diff --git a/test/body.js b/test/body.js
new file mode 100644
index 0000000..b6ace7b
--- /dev/null
+++ b/test/body.js
@@ -0,0 +1,19 @@
+const tap = require("tap")
+const constants = require("../src/lib/constants")
+const {extractSharedData} = require("../src/lib/utils/body")
+const fs = require("fs").promises
+
+tap.test("extract shared data", async childTest => {
+ childTest.throws(() => extractSharedData(""), constants.symbols.NO_SHARED_DATA, "not found in blank")
+ {
+ const page = await fs.readFile("test/files/page-user-instagram.html", "utf8")
+ const sharedData = extractSharedData(page)
+ childTest.equal(sharedData.entry_data.ProfilePage[0].graphql.user.username, "instagram", "can extract user page")
+ }
+ {
+ const page = await fs.readFile("test/files/page-login.html", "utf8")
+ const sharedData = extractSharedData(page)
+ childTest.true(sharedData.entry_data.LoginAndSignupPage[0], "can extract login page")
+ }
+ childTest.end()
+})
diff --git a/test/files/page-login.html b/test/files/page-login.html
new file mode 100644
index 0000000..3eeb42e
--- /dev/null
+++ b/test/files/page-login.html
@@ -0,0 +1,330 @@
+
+
+
+
+
+
+
+Login • Instagram
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/files/page-user-instagram.html b/test/files/page-user-instagram.html
new file mode 100644
index 0000000..86bc9ee
--- /dev/null
+++ b/test/files/page-user-instagram.html
@@ -0,0 +1,345 @@
+
+
+
+
+
+
+
+Instagram (@instagram) • Instagram photos and videos
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/proxyurl.js b/test/proxyurl.js
new file mode 100644
index 0000000..cad85e9
--- /dev/null
+++ b/test/proxyurl.js
@@ -0,0 +1,42 @@
+const tap = require("tap")
+const {proxyImage, proxyVideo, proxyExtendedOwner} = require("../src/lib/utils/proxyurl")
+
+tap.equal(
+ proxyImage("https://scontent-syd2-1.cdninstagram.com/v/t51.2885-15/e35/p1080x1080/83429487_106792960779790_3699017977444758529_n.jpg?_nc_ht=scontent-syd2-1.cdninstagram.com&_nc_cat=1&_nc_ohc=YYmv6lkrblAAX_9u9Kt&oh=81a70f2b92e70873b5ebc9253e7df937&oe=5EBC230A"),
+ "/imageproxy?url=https%3A%2F%2Fscontent-syd2-1.cdninstagram.com%2Fv%2Ft51.2885-15%2Fe35%2Fp1080x1080%2F83429487_106792960779790_3699017977444758529_n.jpg%3F_nc_ht%3Dscontent-syd2-1.cdninstagram.com%26_nc_cat%3D1%26_nc_ohc%3DYYmv6lkrblAAX_9u9Kt%26oh%3D81a70f2b92e70873b5ebc9253e7df937%26oe%3D5EBC230A",
+ "image is proxied"
+)
+
+tap.equal(
+ proxyVideo("https://scontent-syd2-1.cdninstagram.com/v/t50.2886-16/85299832_745217319218455_3874701039913515731_n.mp4?_nc_ht=scontent-syd2-1.cdninstagram.com&_nc_cat=107&_nc_ohc=_Em8_pb3RUIAX8S8tUh&oe=5E3CB718&oh=61d15c21a279f618bab0c5df335635cc"),
+ "/videoproxy?url=https%3A%2F%2Fscontent-syd2-1.cdninstagram.com%2Fv%2Ft50.2886-16%2F85299832_745217319218455_3874701039913515731_n.mp4%3F_nc_ht%3Dscontent-syd2-1.cdninstagram.com%26_nc_cat%3D107%26_nc_ohc%3D_Em8_pb3RUIAX8S8tUh%26oe%3D5E3CB718%26oh%3D61d15c21a279f618bab0c5df335635cc",
+ "video is proxied"
+)
+
+tap.test("proxy extended owner", childTest => {
+ const originalProfilePicURL = "https://scontent-syd2-1.cdninstagram.com/v/t51.2885-19/s150x150/59381178_2348911458724961_5863612957363011584_n.jpg?_nc_ht=scontent-syd2-1.cdninstagram.com&_nc_ohc=TrMM-1zPSA4AX857GJB&oh=15b843b0c1033784492b64b1170cd048&oe=5EC9125D"
+ const owner = {
+ id: "25025320",
+ username: "instagram",
+ is_verified: true,
+ full_name: "Instagram",
+ profile_pic_url: originalProfilePicURL
+ }
+ childTest.same(
+ proxyExtendedOwner(owner),
+ {
+ id: "25025320",
+ username: "instagram",
+ is_verified: true,
+ full_name: "Instagram",
+ profile_pic_url: "/imageproxy?url=https%3A%2F%2Fscontent-syd2-1.cdninstagram.com%2Fv%2Ft51.2885-19%2Fs150x150%2F59381178_2348911458724961_5863612957363011584_n.jpg%3F_nc_ht%3Dscontent-syd2-1.cdninstagram.com%26_nc_ohc%3DTrMM-1zPSA4AX857GJB%26oh%3D15b843b0c1033784492b64b1170cd048%26oe%3D5EC9125D"
+ },
+ "owner was proxied"
+ )
+ childTest.equal(
+ owner.profile_pic_url,
+ originalProfilePicURL,
+ "original owner was not modified"
+ )
+ childTest.end()
+})
diff --git a/test/structuretext.js b/test/structuretext.js
index 3e935c6..82b3355 100644
--- a/test/structuretext.js
+++ b/test/structuretext.js
@@ -12,7 +12,8 @@ tap.same(
{type: "text", text: " "},
{type: "hashtag", text: "#epic", hashtag: "epic"},
{type: "text", text: ""}
- ]
+ ],
+ "partsHashtag works"
)
// lone test username
@@ -26,97 +27,110 @@ tap.same(
{type: "text", text: " with "},
{type: "user", text: "@person", user: "person"},
{type: "text", text: ""}
- ]
+ ],
+ "partsUsername works"
)
-// plain text
-tap.same(
- structure("hello world"),
- [
- {type: "text", text: "hello world"}
- ]
-)
+tap.test("entire structure works", childTest => {
+ // plain text
+ childTest.same(
+ structure("hello world"),
+ [
+ {type: "text", text: "hello world"}
+ ],
+ "plain text"
+ )
-// username
-tap.same(
- structure("hello @person world"),
- [
- {type: "text", text: "hello "},
- {type: "user", text: "@person", user: "person"},
- {type: "text", text: " world"}
- ]
-)
+ // username
+ childTest.same(
+ structure("hello @person world"),
+ [
+ {type: "text", text: "hello "},
+ {type: "user", text: "@person", user: "person"},
+ {type: "text", text: " world"}
+ ],
+ "username"
+ )
-// username at start
-tap.same(
- structure("@person hello"),
- [
- {type: "text", text: ""},
- {type: "user", text: "@person", user: "person"},
- {type: "text", text: " hello"}
- ]
-)
+ // username at start
+ childTest.same(
+ structure("@person hello"),
+ [
+ {type: "text", text: ""},
+ {type: "user", text: "@person", user: "person"},
+ {type: "text", text: " hello"}
+ ],
+ "username at start"
+ )
-// username at end
-tap.same(
- structure("hello @person"),
- [
- {type: "text", text: "hello "},
- {type: "user", text: "@person", user: "person"},
- {type: "text", text: ""},
- ]
-)
+ // username at end
+ childTest.same(
+ structure("hello @person"),
+ [
+ {type: "text", text: "hello "},
+ {type: "user", text: "@person", user: "person"},
+ {type: "text", text: ""},
+ ],
+ "username at end"
+ )
-// multiple usernames
-tap.same(
- structure("hello @person1 @person2"),
- [
- {type: "text", text: "hello "},
- {type: "user", text: "@person1", user: "person1"},
- {type: "text", text: " "},
- {type: "user", text: "@person2", user: "person2"},
- {type: "text", text: ""}
- ]
-)
+ // multiple usernames
+ childTest.same(
+ structure("hello @person1 @person2"),
+ [
+ {type: "text", text: "hello "},
+ {type: "user", text: "@person1", user: "person1"},
+ {type: "text", text: " "},
+ {type: "user", text: "@person2", user: "person2"},
+ {type: "text", text: ""}
+ ],
+ "multiple usernames"
+ )
-// hashtag
-tap.same(
- structure("what a #beautiful day"),
- [
- {type: "text", text: "what a "},
- {type: "hashtag", text: "#beautiful", hashtag: "beautiful"},
- {type: "text", text: " day"}
- ]
-)
+ // hashtag
+ childTest.same(
+ structure("what a #beautiful day"),
+ [
+ {type: "text", text: "what a "},
+ {type: "hashtag", text: "#beautiful", hashtag: "beautiful"},
+ {type: "text", text: " day"}
+ ],
+ "hashtag"
+ )
-// mixed
-tap.same(
- structure("@person what a #beautiful #day in @city"),
- [
- {type: "text", text: ""},
- {type: "user", text: "@person", user: "person"},
- {type: "text", text: " what a "},
- {type: "hashtag", text: "#beautiful", hashtag: "beautiful"},
- {type: "text", text: " "},
- {type: "hashtag", text: "#day", hashtag: "day"},
- {type: "text", text: " in "},
- {type: "user", text: "@city", user: "city"},
- {type: "text", text: ""}
- ]
-)
+ // mixed
+ childTest.same(
+ structure("@person what a #beautiful #day in @city"),
+ [
+ {type: "text", text: ""},
+ {type: "user", text: "@person", user: "person"},
+ {type: "text", text: " what a "},
+ {type: "hashtag", text: "#beautiful", hashtag: "beautiful"},
+ {type: "text", text: " "},
+ {type: "hashtag", text: "#day", hashtag: "day"},
+ {type: "text", text: " in "},
+ {type: "user", text: "@city", user: "city"},
+ {type: "text", text: ""}
+ ],
+ "mixed"
+ )
-// special characters
-tap.same(
- structure("#goodmorning! @city.planner, #parks\nare awesome"),
- [
- {type: "text", text: ""},
- {type: "hashtag", text: "#goodmorning", hashtag: "goodmorning"},
- {type: "text", text: "! "},
- {type: "user", text: "@city.planner", user: "city.planner"},
- {type: "text", text: ", "},
- {type: "hashtag", text: "#parks", hashtag: "parks"},
- {type: "text", text: "\nare awesome"}
- ]
-)
+ // special characters
+ childTest.same(
+ structure("#goodmorning! @city.planner, #parks\nare awesome"),
+ [
+ {type: "text", text: ""},
+ {type: "hashtag", text: "#goodmorning", hashtag: "goodmorning"},
+ {type: "text", text: "! "},
+ {type: "user", text: "@city.planner", user: "city.planner"},
+ {type: "text", text: ", "},
+ {type: "hashtag", text: "#parks", hashtag: "parks"},
+ {type: "text", text: "\nare awesome"}
+ ],
+ "special characters"
+ )
+
+ childTest.end()
+})