start adding media upload test
This commit is contained in:
parent
2cb0dc81f5
commit
9f8b4fa9d8
|
@ -96,7 +96,11 @@
|
||||||
"__assets__",
|
"__assets__",
|
||||||
"test",
|
"test",
|
||||||
"fixture",
|
"fixture",
|
||||||
"Element"
|
"Element",
|
||||||
|
"FormData",
|
||||||
|
"atob",
|
||||||
|
"btoa",
|
||||||
|
"Blob"
|
||||||
],
|
],
|
||||||
"ignore": [
|
"ignore": [
|
||||||
"dist",
|
"dist",
|
||||||
|
|
|
@ -2,7 +2,7 @@ import { store } from '../_store/store'
|
||||||
import { uploadMedia } from '../_api/media'
|
import { uploadMedia } from '../_api/media'
|
||||||
import { toast } from '../_utils/toast'
|
import { toast } from '../_utils/toast'
|
||||||
|
|
||||||
export async function doMediaUpload(file) {
|
export async function doMediaUpload (file) {
|
||||||
let instanceName = store.get('currentInstance')
|
let instanceName = store.get('currentInstance')
|
||||||
let accessToken = store.get('accessToken')
|
let accessToken = store.get('accessToken')
|
||||||
store.set({uploadingMedia: true})
|
store.set({uploadingMedia: true})
|
||||||
|
@ -20,4 +20,4 @@ export async function doMediaUpload(file) {
|
||||||
} finally {
|
} finally {
|
||||||
store.set({uploadingMedia: false})
|
store.set({uploadingMedia: false})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,4 +6,4 @@ export async function uploadMedia (instanceName, accessToken, file) {
|
||||||
formData.append('file', file)
|
formData.append('file', file)
|
||||||
let url = `${basename(instanceName)}/api/v1/media`
|
let url = `${basename(instanceName)}/api/v1/media`
|
||||||
return postWithTimeout(url, formData, auth(accessToken))
|
return postWithTimeout(url, formData, auth(accessToken))
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,17 @@
|
||||||
import { doMediaUpload } from '../../_actions/media'
|
import { doMediaUpload } from '../../_actions/media'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
oncreate() {
|
||||||
|
if (process.env.NODE_ENV !== 'production') {
|
||||||
|
window.__fakeFileInput = (file) => {
|
||||||
|
this.onFileChange({
|
||||||
|
target: {
|
||||||
|
files: [file]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
components: {
|
components: {
|
||||||
IconButton
|
IconButton
|
||||||
},
|
},
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
export function base64StringToBlob (base64, type) {
|
||||||
|
function binaryStringToArrayBuffer (binary) {
|
||||||
|
let length = binary.length
|
||||||
|
let buf = new ArrayBuffer(length)
|
||||||
|
let arr = new Uint8Array(buf)
|
||||||
|
let i = -1
|
||||||
|
while (++i < length) {
|
||||||
|
arr[i] = binary.charCodeAt(i)
|
||||||
|
}
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
let parts = [binaryStringToArrayBuffer(atob(base64))]
|
||||||
|
return type ? new Blob(parts, {type: type}) : new Blob(parts)
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
export const image1 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=='
|
|
@ -2,7 +2,7 @@ import { Selector as $ } from 'testcafe'
|
||||||
import {
|
import {
|
||||||
composeButton, composeInput, composeLengthIndicator, emojiButton, getComposeSelectionStart, getUrl,
|
composeButton, composeInput, composeLengthIndicator, emojiButton, getComposeSelectionStart, getUrl,
|
||||||
homeNavButton,
|
homeNavButton,
|
||||||
notificationsNavButton
|
notificationsNavButton, uploadMedia
|
||||||
} from '../utils'
|
} from '../utils'
|
||||||
import { foobarRole } from '../roles'
|
import { foobarRole } from '../roles'
|
||||||
import times from 'lodash/times'
|
import times from 'lodash/times'
|
||||||
|
@ -91,3 +91,9 @@ test('inserts emoji without typing anything', async t => {
|
||||||
.click($('button img[title=":blobpeek:"]'))
|
.click($('button img[title=":blobpeek:"]'))
|
||||||
.expect(composeInput.value).eql(':blobpeek: :blobpats: ')
|
.expect(composeInput.value).eql(':blobpeek: :blobpats: ')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('inserts media', async t => {
|
||||||
|
await t.useRole(foobarRole)
|
||||||
|
await uploadMedia()
|
||||||
|
await t.expect($('.compose-media:nth-child(1) img').getAttribute('alt')).eql('foo.png')
|
||||||
|
})
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
import { ClientFunction as exec, Selector as $ } from 'testcafe'
|
import { ClientFunction as exec, Selector as $ } from 'testcafe'
|
||||||
|
import * as images from './images'
|
||||||
|
import * as blobUtils from './blobUtils'
|
||||||
|
|
||||||
const SCROLL_INTERVAL = 3
|
const SCROLL_INTERVAL = 3
|
||||||
|
|
||||||
export const settingsButton = $('nav a[aria-label=Settings]')
|
export const settingsButton = $('nav a[aria-label=Settings]')
|
||||||
export const instanceInput = $('#instanceInput')
|
export const instanceInput = $('#instanceInput')
|
||||||
export const addInstanceButton = $('.add-new-instance button')
|
|
||||||
export const modalDialogContents = $('.modal-dialog-contents')
|
export const modalDialogContents = $('.modal-dialog-contents')
|
||||||
export const closeDialogButton = $('.close-dialog-button')
|
export const closeDialogButton = $('.close-dialog-button')
|
||||||
export const notificationsNavButton = $('nav a[href="/notifications"]')
|
export const notificationsNavButton = $('nav a[href="/notifications"]')
|
||||||
|
@ -38,6 +39,17 @@ export const getComposeSelectionStart = exec(() => composeInput().selectionStart
|
||||||
dependencies: { composeInput }
|
dependencies: { composeInput }
|
||||||
})
|
})
|
||||||
|
|
||||||
|
export const uploadMedia = exec(() => {
|
||||||
|
let blob = blobUtils.base64StringToBlob(images.image1, 'image/png')
|
||||||
|
blob.name = 'foo.png'
|
||||||
|
window.__fakeFileInput(blob)
|
||||||
|
}, {
|
||||||
|
dependencies: {
|
||||||
|
images,
|
||||||
|
blobUtils
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
export function getNthStatus (n) {
|
export function getNthStatus (n) {
|
||||||
return $(`div[aria-hidden="false"] > article[aria-posinset="${n}"]`)
|
return $(`div[aria-hidden="false"] > article[aria-posinset="${n}"]`)
|
||||||
}
|
}
|
||||||
|
@ -106,18 +118,6 @@ export async function validateTimeline (t, timeline) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function scrollTimelineUp (t) {
|
|
||||||
let oldFirstItem = await getFirstVisibleStatus().getAttribute('aria-posinset')
|
|
||||||
await t.hover(getFirstVisibleStatus())
|
|
||||||
let newFirstItem
|
|
||||||
while (true) {
|
|
||||||
newFirstItem = await getFirstVisibleStatus().getAttribute('aria-posinset')
|
|
||||||
if (newFirstItem === '0' || newFirstItem !== oldFirstItem) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function scrollToTopOfTimeline (t) {
|
export async function scrollToTopOfTimeline (t) {
|
||||||
let i = await getFirstVisibleStatus().getAttribute('aria-posinset')
|
let i = await getFirstVisibleStatus().getAttribute('aria-posinset')
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
Loading…
Reference in New Issue