continue on test data instance restoration

This commit is contained in:
Nolan Lawson 2018-03-05 20:29:49 -08:00
parent 253e14dc9c
commit 9872f6073e
16 changed files with 379 additions and 224 deletions

220
bin/mastodon-data.js Normal file
View File

@ -0,0 +1,220 @@
const times = require('lodash/times')
export const actions = times(30, i => ({
post: {
text: (i + 1)
},
user: 'admin'
})).concat([
{
user: 'foobar',
post: {
text: 'hello world'
}
},
{
user: 'foobar',
post: {
text: "here's a kitten",
media: ['kitten1.jpg']
}
},
{
user: 'foobar',
post: {
text: "here's a secret kitten",
media: ['kitten2.jpg'],
sensitive: true
}
},
{
user: 'foobar',
post: {
text: "here's 2 kitten photos",
media: ['kitten3.jpg', 'kitten4.jpg']
}
},
{
user: 'foobar',
post: {
text: "here's an animated kitten gif",
media: ['kitten1.gif']
}
},
{
user: 'foobar',
post: {
text: "here's a secret animated kitten gif",
media: ['kitten2.gif'],
sensitive: true
}
},
{
user: 'foobar',
post: {
text: "content warning",
spoiler: 'CW'
}
},
{
user: 'foobar',
post: {
text: "here's a video",
media: ['kitten1.mp4']
}
},
{
user: 'foobar',
post: {
text: "here's a secret video",
media: ['kitten2.mp4']
}
},
{
user: 'foobar',
post: {
text: "here's a kitten with a CW",
media: ['kitten5.jpg'],
sensitive: true,
spoiler: 'kitten CW'
}
},
// notifications for foobar
{
user: 'admin',
follow: 'foobar'
},
{
user: 'admin',
post: {
text: '@foobar hello foobar',
privacy: 'unlisted'
}
},
{
user: 'quux',
follow: 'foobar'
},
{
user: 'admin',
post: {
internalId: 3,
text: '@foobar notification of direct message',
privacy: 'direct'
}
},
{
user: 'admin',
favorite: 3
},
{
user: 'admin',
post: {
internalId: 4,
text: '@foobar notification of followers-only message',
privacy: 'private'
}
},
{
user: 'admin',
favorite: 4
},
{
user: 'admin',
post: {
internalId: 1,
text: '@foobar notification of unlisted message',
privacy: 'unlisted'
}
},
{
user: 'admin',
boost: 1
},
{
user: 'foobar',
post: {
internalId: 2,
text: 'this is unlisted',
privacy: 'private'
}
},
{
user: 'admin',
boost: 2
},
{
user: 'admin',
favorite: 2
},
{
user: 'quux',
post: {
internalId: 5,
text: 'pinned toot 1',
privacy: 'private'
}
},
{
user: 'quux',
post: {
internalId: 6,
text: 'pinned toot 2',
privacy: 'private'
}
}
]).concat(times(25, i => ({
user: 'quux',
post: {
internalId: 100 + i,
text: 'unlisted thread ' + (i + 1),
privacy: 'private',
inReplyTo: i > 0 && (100 + i)
}
}))).concat([
{
user: 'quux',
pin: 5
},
{
user: 'quux',
pin: 6
},
{
user: 'admin',
boost: 5
},
{
user: 'admin',
favorite: 5
},
{
user: 'foobar',
favorite: 5
},
{
user: 'admin',
favorite: 6
},
{
user: 'ExternalLinks',
post: {
text: 'here are some hashtags: #kitten #kitties',
privacy: 'private'
}
},
{
user: 'ExternalLinks',
post: {
text: 'here are some external links: https://joinmastodon.org https://github.com/tootsuite/mastodon',
privacy: 'private'
}
},
{
user: 'ExternalLinks',
post: {
text: 'here are some users: @admin @quux',
privacy: 'private'
}
}
])

View File

@ -1,226 +1,44 @@
const times = require('lodash/times') import { actions } from './mastodon-data'
import { users } from '../tests/users'
import { postStatus } from '../routes/_api/statuses'
import { uploadMedia } from '../routes/_api/media'
import { followAccount } from '../routes/_api/follow'
import { favoriteStatus } from '../routes/_api/favorite'
import { reblogStatus } from '../routes/_api/reblog'
const actions = times(30, i => ({ import path from 'path'
post: { global.File = require('file-api').File
text: (i + 1) global.FormData = require('file-api').FormData
}, global.fetch = require('node-fetch')
user: 'admin'
})).concat([
{
user: 'foobar',
post: {
text: 'hello world'
}
},
{
user: 'foobar',
post: {
text: "here's a kitten",
media: ['kitten1.jpg']
}
},
{
user: 'foobar',
post: {
text: "here's a secret kitten",
media: ['kitten2.jpg'],
sensitive: true
}
},
{
user: 'foobar',
post: {
text: "here's 2 kitten photos",
media: ['kitten3.jpg', 'kitten4.jpg']
}
},
{
user: 'foobar',
post: {
text: "here's an animated kitten gif",
media: ['kitten1.gif']
}
},
{
user: 'foobar',
post: {
text: "here's a secret animated kitten gif",
media: ['kitten2.gif'],
sensitive: true
}
},
{
user: 'foobar',
post: {
text: "content warning",
spoiler: 'CW'
}
},
{
user: 'foobar',
post: {
text: "here's a video",
media: ['kitten1.mp4']
}
},
{
user: 'foobar',
post: {
text: "here's a secret video",
media: ['kitten2.mp4']
}
},
{
user: 'foobar',
post: {
text: "here's a kitten with a CW",
media: ['kitten5.jpg'],
sensitive: true,
spoiler: 'kitten CW'
}
},
// notifications for foobar
{
user: 'admin',
follow: 'foobar'
},
{
user: 'admin',
post: {
text: '@foobar hello foobar',
privacy: 'unlisted'
}
},
{
user: 'quux',
follow: 'foobar'
},
{
user: 'admin',
post: {
internalId: 3,
text: '@foobar notification of direct message',
privacy: 'direct'
}
},
{
user: 'admin',
favorite: 3
},
{
user: 'admin',
post: {
internalId: 4,
text: '@foobar notification of followers-only message',
privacy: 'private'
}
},
{
user: 'admin',
favorite: 4
},
{
user: 'admin',
post: {
internalId: 1,
text: '@foobar notification of unlisted message',
privacy: 'unlisted'
}
},
{
user: 'admin',
boost: 1
},
{
user: 'foobar',
post: {
internalId: 2,
text: 'this is unlisted',
privacy: 'private'
}
},
{
user: 'admin',
boost: 2
},
{
user: 'admin',
favorite: 2
},
{
user: 'quux',
post: {
internalId: 5,
text: 'pinned toot 1',
privacy: 'private'
}
},
{
user: 'quux',
post: {
internalId: 6,
text: 'pinned toot 2',
privacy: 'private'
}
}
]).concat(times(25, i => ({
user: 'quux',
post: {
internalId: 100 + i,
text: 'unlisted thread ' + (i + 1),
privacy: 'private',
inReplyTo: i > 0 && (100 + i)
}
}))).concat([
{
user: 'quux',
pin: 5
},
{
user: 'quux',
pin: 6
},
{
user: 'admin',
boost: 5
},
{
user: 'admin',
favorite: 5
},
{
user: 'foobar',
favorite: 5
},
{
user: 'admin',
favorite: 6
},
{
user: 'ExternalLinks',
post: {
text: 'here are some hashtags: #kitten #kitties',
privacy: 'private'
}
},
{
user: 'ExternalLinks',
post: {
text: 'here are some external links: https://joinmastodon.org https://github.com/tootsuite/mastodon',
privacy: 'private'
}
},
{
user: 'ExternalLinks',
post: {
text: 'here are some users: @admin @quux',
privacy: 'private'
}
}
])
async function restoreMastodonData () { async function restoreMastodonData () {
console.log('Restoring mastodon data...') console.log('Restoring mastodon data...')
let internalIdsToIds = {}
for (let action of actions) {
let accessToken = users[action.user].accessToken
if (action.post) {
let { text, media, sensitive, spoiler, privacy, inReplyTo, internalId } = action.post
if (typeof inReplyTo !== 'undefined') {
inReplyTo = internalIdsToIds[inReplyTo]
}
let mediaIds = media && await Promise.all(media.map(async mediaItem => {
let file = new File(path.join(__dirname, '../tests/images/' + mediaItem))
let mediaResponse = await uploadMedia('localhost:3000', accessToken, file)
return mediaResponse.id
}))
let status = await postStatus('localhost:3000', accessToken, text, inReplyTo, mediaIds,
sensitive, spoiler, privacy || 'public')
if (typeof internalId !== 'undefined') {
internalIdsToIds[internalId] = status.id
}
} else if (action.follow) {
await followAccount('localhost:3000', accessToken, action.follow)
} else if (action.favorite) {
await favoriteStatus('localhost:3000', accessToken, internalIdsToIds[action.favorite])
} else if (action.boost) {
await reblogStatus('localhost:3000', accessToken, internalIdsToIds[action.favorite])
}
}
} }
module.exports = restoreMastodonData module.exports = restoreMastodonData

View File

@ -1,4 +1,4 @@
const restoreMastodonData = require ('./restore-mastodon-data') const restoreMastodonData = require('./restore-mastodon-data')
const pify = require('pify') const pify = require('pify')
const exec = require('child-process-promise').exec const exec = require('child-process-promise').exec
const spawn = require('child-process-promise').spawn const spawn = require('child-process-promise').spawn
@ -71,7 +71,7 @@ async function runMastodon () {
async function main () { async function main () {
await cloneMastodon() await cloneMastodon()
await setupMastodonDatabase() //await setupMastodonDatabase()
await runMastodon() await runMastodon()
//await restoreMastodonData() //await restoreMastodonData()
} }

Binary file not shown.

Binary file not shown.

78
package-lock.json generated
View File

@ -9,6 +9,11 @@
"resolved": "https://registry.npmjs.org/@gamestdio/websocket/-/websocket-0.2.2.tgz", "resolved": "https://registry.npmjs.org/@gamestdio/websocket/-/websocket-0.2.2.tgz",
"integrity": "sha512-ptWTKBq6IliC7lNhfAI/YI5WBjhPClflZV61V7In/qxGbgrWrlny6/Df4NtrUs7QUeNccv8yqQwjjw+f0veGjQ==" "integrity": "sha512-ptWTKBq6IliC7lNhfAI/YI5WBjhPClflZV61V7In/qxGbgrWrlny6/Df4NtrUs7QUeNccv8yqQwjjw+f0veGjQ=="
}, },
"@std/esm": {
"version": "0.25.0",
"resolved": "https://registry.npmjs.org/@std/esm/-/esm-0.25.0.tgz",
"integrity": "sha512-htyUY4TrUSMYLdtmk2RPrNJJGZPAhliYcjf5vIh+RMVEI6Yy88Jl98cWcJY8McPcrizkXdbzOGFtp6pf8qd45w=="
},
"@types/chalk": { "@types/chalk": {
"version": "0.4.31", "version": "0.4.31",
"resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz", "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
@ -34,6 +39,19 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.0.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.0.tgz",
"integrity": "sha512-zkYho6/4wZyX6o9UQ8rd0ReEaiEYNNCqYFIAACe2Tf9DrYlgzWW27OigYHnnztnnZQwVRpwWmZKegFmDpinIsA==" "integrity": "sha512-zkYho6/4wZyX6o9UQ8rd0ReEaiEYNNCqYFIAACe2Tf9DrYlgzWW27OigYHnnztnnZQwVRpwWmZKegFmDpinIsA=="
}, },
"File": {
"version": "0.10.2",
"resolved": "https://registry.npmjs.org/File/-/File-0.10.2.tgz",
"integrity": "sha1-6Jn3dtJz4iQ7qGEFuzsFbQ+5VgQ=",
"requires": {
"mime": "1.4.1"
}
},
"FileList": {
"version": "0.10.2",
"resolved": "https://registry.npmjs.org/FileList/-/FileList-0.10.2.tgz",
"integrity": "sha1-YAOxqXFZNBZLZ8Q0rWqHQaHNFHo="
},
"a11y-dialog": { "a11y-dialog": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/a11y-dialog/-/a11y-dialog-4.0.1.tgz", "resolved": "https://registry.npmjs.org/a11y-dialog/-/a11y-dialog-4.0.1.tgz",
@ -1351,6 +1369,11 @@
"resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
"integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
}, },
"bufferjs": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/bufferjs/-/bufferjs-3.0.1.tgz",
"integrity": "sha1-BpLoKcsQoQVQ5kc5CwNesGw46O8="
},
"builtin-modules": { "builtin-modules": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
@ -3261,6 +3284,21 @@
"object-assign": "4.1.1" "object-assign": "4.1.1"
} }
}, },
"file-api": {
"version": "0.10.4",
"resolved": "https://registry.npmjs.org/file-api/-/file-api-0.10.4.tgz",
"integrity": "sha1-LxASJttyfMAXKg3WiPL2iD1SiD0=",
"requires": {
"File": "0.10.2",
"FileList": "0.10.2",
"bufferjs": "3.0.1",
"file-error": "0.10.2",
"filereader": "0.10.3",
"formdata": "0.10.4",
"mime": "1.4.1",
"remedial": "1.0.7"
}
},
"file-entry-cache": { "file-entry-cache": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
@ -3270,11 +3308,21 @@
"object-assign": "4.1.1" "object-assign": "4.1.1"
} }
}, },
"file-error": {
"version": "0.10.2",
"resolved": "https://registry.npmjs.org/file-error/-/file-error-0.10.2.tgz",
"integrity": "sha1-ljtIuSc7PUuEtADuVxvHixc5cko="
},
"filename-regex": { "filename-regex": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
"integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
}, },
"filereader": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/filereader/-/filereader-0.10.3.tgz",
"integrity": "sha1-x0fUos2PYeVBinwH/hJXpD8KzbE="
},
"filesize": { "filesize": {
"version": "3.6.0", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.0.tgz", "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.0.tgz",
@ -3467,6 +3515,11 @@
"resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
"integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
}, },
"foreachasync": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz",
"integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY="
},
"forever-agent": { "forever-agent": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@ -3482,6 +3535,26 @@
"mime-types": "2.1.17" "mime-types": "2.1.17"
} }
}, },
"formdata": {
"version": "0.10.4",
"resolved": "https://registry.npmjs.org/formdata/-/formdata-0.10.4.tgz",
"integrity": "sha1-liH9wMw2H0oBEd5dJbNfanjcVaA=",
"requires": {
"File": "0.10.2",
"FileList": "0.10.2",
"bufferjs": "2.0.0",
"filereader": "0.10.3",
"foreachasync": "3.0.0",
"remedial": "1.0.7"
},
"dependencies": {
"bufferjs": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/bufferjs/-/bufferjs-2.0.0.tgz",
"integrity": "sha1-aF5x7VwGAOPXA/+b0BK7MnCjnig="
}
}
},
"forwarded": { "forwarded": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
@ -7805,6 +7878,11 @@
"isobject": "2.1.0" "isobject": "2.1.0"
} }
}, },
"remedial": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.7.tgz",
"integrity": "sha1-1mdEE6ZWdgB74A3UAJgJh7LDAME="
},
"remove-trailing-separator": { "remove-trailing-separator": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",

View File

@ -12,7 +12,7 @@
"build-svg": "node ./bin/build-svg.js", "build-svg": "node ./bin/build-svg.js",
"build-sass": "node ./bin/build-sass.js", "build-sass": "node ./bin/build-sass.js",
"build-sass-watch": "node ./bin/build-sass.js --watch", "build-sass-watch": "node ./bin/build-sass.js --watch",
"run-mastodon": "node ./bin/run-mastodon", "run-mastodon": "node -r @std/esm ./bin/run-mastodon",
"run-testcafe": "cross-env-shell testcafe --hostname localhost --skip-js-errors $BROWSER tests/spec", "run-testcafe": "cross-env-shell testcafe --hostname localhost --skip-js-errors $BROWSER tests/spec",
"test": "cross-env BROWSER=chrome:headless npm run test-browser", "test": "cross-env BROWSER=chrome:headless npm run test-browser",
"test-browser": "run-p --race run-mastodon dev test-mastodon", "test-browser": "run-p --race run-mastodon dev test-mastodon",
@ -24,6 +24,7 @@
}, },
"dependencies": { "dependencies": {
"@gamestdio/websocket": "^0.2.2", "@gamestdio/websocket": "^0.2.2",
"@std/esm": "^0.25.0",
"a11y-dialog": "^4.0.1", "a11y-dialog": "^4.0.1",
"cheerio": "^1.0.0-rc.2", "cheerio": "^1.0.0-rc.2",
"child-process-promise": "^2.2.1", "child-process-promise": "^2.2.1",
@ -34,6 +35,7 @@
"express": "^4.16.2", "express": "^4.16.2",
"extract-text-webpack-plugin": "^3.0.2", "extract-text-webpack-plugin": "^3.0.2",
"fg-loadcss": "^2.0.1", "fg-loadcss": "^2.0.1",
"file-api": "^0.10.4",
"font-awesome-svg-png": "^1.2.2", "font-awesome-svg-png": "^1.2.2",
"glob": "^7.1.2", "glob": "^7.1.2",
"idb-keyval": "^2.3.0", "idb-keyval": "^2.3.0",
@ -105,5 +107,8 @@
"dist", "dist",
"routes/_utils/asyncModules.js" "routes/_utils/asyncModules.js"
] ]
},
"@std/esm": {
"mode": "js"
} }
} }

12
routes/_api/follow.js Normal file
View File

@ -0,0 +1,12 @@
import { postWithTimeout } from '../_utils/ajax'
import { auth, basename } from './utils'
export async function followAccount(instanceName, accessToken, accountId) {
let url = `${basename(instanceName)}/api/v1/accounts/${accountId}/follow`
return postWithTimeout(url, null, auth(accessToken))
}
export async function unfollowAccount(instanceName, accessToken, accountId) {
let url = `${basename(instanceName)}/api/v1/accounts/${accountId}/unfollow`
return postWithTimeout(url, null, auth(accessToken))
}

BIN
tests/images/kitten1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

BIN
tests/images/kitten1.mp4 Normal file

Binary file not shown.

BIN
tests/images/kitten2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
tests/images/kitten2.mp4 Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -2,8 +2,8 @@ import { favoriteStatus } from '../routes/_api/favorite'
import fetch from 'node-fetch' import fetch from 'node-fetch'
global.fetch = fetch global.fetch = fetch
const accessToken = 'a306d698185db24b12385a5432817551d7ac94bdcbe23233d4e5eff70f6408c4' import { users } from './users'
export async function favoriteStatusAsAdmin (statusId) { export async function favoriteStatusAsAdmin (statusId) {
return favoriteStatus('localhost:3000', accessToken, statusId) return favoriteStatus('localhost:3000', users.admin.accessToken, statusId)
} }

22
tests/users.js Normal file
View File

@ -0,0 +1,22 @@
export const users = {
admin: {
username: 'admin',
password: 'mastodonadmin',
accessToken: '1a62cc93aa6ccdad5a1048bd37b627c9df72f68c7f4b87d2daaeb83010ff44ab'
},
foobar: {
username: 'foobar',
password: 'foobarfoobar',
accessToken: '67868cd5b1f1279697ffffdb44c144b0ae427d74f4540717b67bf4a9c5c5c346'
},
quux: {
username: 'quux',
password: 'quuxquuxquux',
accessToken: 'd100083c1749392da7e1c12e63a6fba75f15ea1fbce93361d722889abf418464'
},
ExternalLinks: {
username: 'ExternalLinks',
password: 'ExternalLinksExternalLink',
accessToken: 'e9a463ba1729ae0049a97a312af702cb3d08d84de1cc8d6da3fad90af068117b'
}
}