forked from cybrespace/pinafore
start adding media upload test
This commit is contained in:
parent
2cb0dc81f5
commit
9f8b4fa9d8
|
@ -96,7 +96,11 @@
|
|||
"__assets__",
|
||||
"test",
|
||||
"fixture",
|
||||
"Element"
|
||||
"Element",
|
||||
"FormData",
|
||||
"atob",
|
||||
"btoa",
|
||||
"Blob"
|
||||
],
|
||||
"ignore": [
|
||||
"dist",
|
||||
|
|
|
@ -2,7 +2,7 @@ import { store } from '../_store/store'
|
|||
import { uploadMedia } from '../_api/media'
|
||||
import { toast } from '../_utils/toast'
|
||||
|
||||
export async function doMediaUpload(file) {
|
||||
export async function doMediaUpload (file) {
|
||||
let instanceName = store.get('currentInstance')
|
||||
let accessToken = store.get('accessToken')
|
||||
store.set({uploadingMedia: true})
|
||||
|
@ -20,4 +20,4 @@ export async function doMediaUpload(file) {
|
|||
} finally {
|
||||
store.set({uploadingMedia: false})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,4 +6,4 @@ export async function uploadMedia (instanceName, accessToken, file) {
|
|||
formData.append('file', file)
|
||||
let url = `${basename(instanceName)}/api/v1/media`
|
||||
return postWithTimeout(url, formData, auth(accessToken))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,17 @@
|
|||
import { doMediaUpload } from '../../_actions/media'
|
||||
|
||||
export default {
|
||||
oncreate() {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
window.__fakeFileInput = (file) => {
|
||||
this.onFileChange({
|
||||
target: {
|
||||
files: [file]
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
components: {
|
||||
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 {
|
||||
composeButton, composeInput, composeLengthIndicator, emojiButton, getComposeSelectionStart, getUrl,
|
||||
homeNavButton,
|
||||
notificationsNavButton
|
||||
notificationsNavButton, uploadMedia
|
||||
} from '../utils'
|
||||
import { foobarRole } from '../roles'
|
||||
import times from 'lodash/times'
|
||||
|
@ -91,3 +91,9 @@ test('inserts emoji without typing anything', async t => {
|
|||
.click($('button img[title=":blobpeek:"]'))
|
||||
.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 * as images from './images'
|
||||
import * as blobUtils from './blobUtils'
|
||||
|
||||
const SCROLL_INTERVAL = 3
|
||||
|
||||
export const settingsButton = $('nav a[aria-label=Settings]')
|
||||
export const instanceInput = $('#instanceInput')
|
||||
export const addInstanceButton = $('.add-new-instance button')
|
||||
export const modalDialogContents = $('.modal-dialog-contents')
|
||||
export const closeDialogButton = $('.close-dialog-button')
|
||||
export const notificationsNavButton = $('nav a[href="/notifications"]')
|
||||
|
@ -38,6 +39,17 @@ export const getComposeSelectionStart = exec(() => composeInput().selectionStart
|
|||
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) {
|
||||
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) {
|
||||
let i = await getFirstVisibleStatus().getAttribute('aria-posinset')
|
||||
while (true) {
|
||||
|
|
Loading…
Reference in New Issue