forked from cybrespace/pinafore
		
	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__", |       "__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}) | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
							
								
								
									
										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 { | 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…
	
	Add table
		
		Reference in a new issue