diff --git a/app/mobile/src/context/useUploadContext.hook.js b/app/mobile/src/context/useUploadContext.hook.js index c148a082..20ddbd7e 100644 --- a/app/mobile/src/context/useUploadContext.hook.js +++ b/app/mobile/src/context/useUploadContext.hook.js @@ -57,11 +57,15 @@ export function useUploadContext() { } const actions = { - addTopic: (node, token, channelId, topicId, files, success, failure) => { + addTopic: (node, token, channelId, topicId, files, success, failure, cardId) => { + const url = cardId ? + `https://${node}/content/channels/${channelId}/topics/${topicId}/assets?contact=${token}` : + `https://${node}/content/channels/${channelId}/topics/${topicId}/assets?agent=${token}`; + const key = cardId ? `${cardId}:${channelId}` : `:${channelId}`; const controller = new AbortController(); const entry = { index: index.current, - url: `https://${node}/content/channels/${channelId}/topics/${topicId}/assets?agent=${token}`, + url: url, files, assets: [], current: null, @@ -71,39 +75,17 @@ export function useUploadContext() { cancel: controller, } index.current += 1; - const key = `:${channelId}`; if (!channels.current.has(key)) { channels.current.set(key, new Map()); } const topics = channels.current.get(key); topics.set(topicId, entry); + upload(entry, updateProgress, () => { updateComplete(key, topicId) } ); }, cancelTopic: (channelId, topicId) => { abort(`:${channelId}`, topicId); }, - addContactTopic: (node, token, cardId, channelId, topicId, files, success, failure) => { - const controller = new AbortController(); - const entry = { - index: index.current, - url: `https://${node}/content/channels/${channelId}/topics/${topicId}/assets?contact=${token}`, - files, - assets: [], - current: null, - error: false, - success, - failure, - cancel: controller, - } - index.current += 1; - const key = `${cardId}:${channelId}`; - if (!channels.current.has(key)) { - channels.current.set(key, new Map()); - } - const topics = channels.current.get(key); - topics.set(topicId, entry); - upload(entry, updateProgress, () => { updateComplete(key, topicId) }); - }, cancelContactTopic: (cardId, channelId, topicId) => { abort(`${cardId}:${channelId}`, topicId); }, diff --git a/app/mobile/test/Upload.test.js b/app/mobile/test/Upload.test.js new file mode 100644 index 00000000..46f12bca --- /dev/null +++ b/app/mobile/test/Upload.test.js @@ -0,0 +1,94 @@ +import React, { useState, useEffect, useContext } from 'react'; +import { View, Text } from 'react-native'; +import {render, act, screen, waitFor, fireEvent} from '@testing-library/react-native' +import { UploadContextProvider, UploadContext } from 'context/UploadContext'; +import axios from 'axios'; + +function UploadView() { + const [renderCount, setRenderCount] = useState(0); + const [total, setTotal] = useState(0); + const [channel, setChannel] = useState(0); + const upload = useContext(UploadContext); + + useEffect(() => { + setRenderCount(renderCount + 1); + + upload.state.progress.forEach((value, key) => { + value.forEach(topic => { + if (topic.active?.total > total) { + setTotal(topic.active?.total); + }; + }); + setChannel(key); + }); + + }, [upload.state]); + + return ( + + { channel } + { total } + + ); +} + +function UploadTestApp() { + return ( + + + + ) +} + +const realPost = axios.post; +let asset; +beforeEach(() => { + asset = {}; + + const mockPost = jest.fn().mockImplementation(async (url, data, options) => { + for (let i = 0; i < 10; i++) { + await new Promise(r => setTimeout(r, 10)); + options.onUploadProgress({ loaded: i * 11, total: 111 }); + } + + return Promise.resolve({ data: asset }); + }); + axios.post = mockPost; +}); + +afterEach(() => { + axios.post = realPost; +}); + +test('testing', async () => { + render() + + asset = [ { assetId: '3', transform: 'acopy;audio', status: 'pending' } ]; + + setComplete = false; + await act(async () => { + const upload = screen.getByTestId('upload').props.upload; + upload.actions.addTopic('test.org', 'asdf', '123', '1', [{ type: 'audio', data: 'asdf'}], ()=>{setComplete=true}, ()=>{}); + }); + + await waitFor(async () => { + expect(setComplete).toBe(true); + expect(screen.getByTestId('total').props.children).toBe(111); + expect(screen.getByTestId('channel').props.children).toBe(':123'); + }); + + setComplete = false; + await act(async () => { + const upload = screen.getByTestId('upload').props.upload; + upload.actions.addTopic('test.org', 'asdf', '123', '1', [{ type: 'audio', data: 'asdf'}], ()=>{setComplete=true}, ()=>{}, '96'); + }); + + await waitFor(async () => { + expect(setComplete).toBe(true); + expect(screen.getByTestId('channel').props.children).toBe('96:123'); + }); + +}); + + +