start adding media upload test
This commit is contained in:
		
							parent
							
								
									2cb0dc81f5
								
							
						
					
					
						commit
						9f8b4fa9d8
					
				
					 8 changed files with 55 additions and 18 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										15
									
								
								tests/blobUtils.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								tests/blobUtils.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								tests/images.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/images.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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…
	
	Add table
		
		Reference in a new issue