From a3077f1b97b65d477e9b83f7a8b914d1a304b83c Mon Sep 17 00:00:00 2001 From: Devlin Junker Date: Wed, 30 Aug 2023 22:13:58 -0700 Subject: fix loading bug and move to feed-display directory Signed-off-by: Devlin Junker --- .../unit/components/FeedItemDisplay.spec.ts | 92 --------------- .../unit/components/FeedItemDisplayList.spec.ts | 66 ----------- .../javascript/unit/components/FeedItemRow.spec.ts | 127 --------------------- .../feed-display/FeedItemDisplay.spec.ts | 92 +++++++++++++++ .../feed-display/FeedItemDisplayList.spec.ts | 66 +++++++++++ .../components/feed-display/FeedItemRow.spec.ts | 127 +++++++++++++++++++++ 6 files changed, 285 insertions(+), 285 deletions(-) delete mode 100644 tests/javascript/unit/components/FeedItemDisplay.spec.ts delete mode 100644 tests/javascript/unit/components/FeedItemDisplayList.spec.ts delete mode 100644 tests/javascript/unit/components/FeedItemRow.spec.ts create mode 100644 tests/javascript/unit/components/feed-display/FeedItemDisplay.spec.ts create mode 100644 tests/javascript/unit/components/feed-display/FeedItemDisplayList.spec.ts create mode 100644 tests/javascript/unit/components/feed-display/FeedItemRow.spec.ts (limited to 'tests') diff --git a/tests/javascript/unit/components/FeedItemDisplay.spec.ts b/tests/javascript/unit/components/FeedItemDisplay.spec.ts deleted file mode 100644 index 594ccf9c1..000000000 --- a/tests/javascript/unit/components/FeedItemDisplay.spec.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { shallowMount, createLocalVue, Wrapper } from '@vue/test-utils' - -import FeedItemDisplay from '../../../../src/components/FeedItemDisplay.vue' -import { ACTIONS, MUTATIONS } from '../../../../src/store' - -describe('FeedItemDisplay.vue', () => { - 'use strict' - const localVue = createLocalVue() - let wrapper: Wrapper - - const mockItem = { - feedId: 1, - title: 'feed item', - pubDate: Date.now() / 1000, - } - const mockFeed = { - id: 1, - } - - const dispatchStub = jest.fn() - const commitStub = jest.fn() - beforeAll(() => { - wrapper = shallowMount(FeedItemDisplay, { - propsData: { - item: mockItem, - }, - localVue, - mocks: { - $store: { - getters: { - feeds: [mockFeed], - }, - state: { - feeds: [], - folders: [], - }, - dispatch: dispatchStub, - commit: commitStub, - }, - }, - }) - }) - - beforeEach(() => { - dispatchStub.mockReset() - commitStub.mockReset() - }) - - it('should send SET_SELECTED_ITEM with undefined id', () => { - (wrapper.vm as any).clearSelected() - - expect(commitStub).toBeCalledWith(MUTATIONS.SET_SELECTED_ITEM, { id: undefined }) - }) - - it('should format date to match locale', () => { - const epoch = Date.now() // Provide an epoch timestamp - const formattedDate = (wrapper.vm as any).formatDate(epoch) - - expect(formattedDate).toEqual(new Date(epoch).toLocaleString()) - }) - - it('should format datetime to match international standard', () => { - const epoch = Date.now() // Provide an epoch timestamp - const formattedDate = (wrapper.vm as any).formatDatetime(epoch) - - expect(formattedDate).toEqual(new Date(epoch).toISOString()) - }) - - it('should retrieve feed by ID', () => { - const feed = (wrapper.vm as any).getFeed(mockFeed.id) - - expect(feed).toEqual(mockFeed) - }) - - it('toggles starred state', () => { - wrapper.vm.$props.item.starred = true; - - (wrapper.vm as any).toggleStarred(wrapper.vm.$props.item) - expect(dispatchStub).toHaveBeenCalledWith(ACTIONS.UNSTAR_ITEM, { - item: wrapper.vm.$props.item, - }) - - wrapper.vm.$props.item.starred = false; - - (wrapper.vm as any).toggleStarred(wrapper.vm.$props.item) - expect(dispatchStub).toHaveBeenCalledWith(ACTIONS.STAR_ITEM, { - item: wrapper.vm.$props.item, - }) - }) - - // TODO: Audio/Video tests -}) diff --git a/tests/javascript/unit/components/FeedItemDisplayList.spec.ts b/tests/javascript/unit/components/FeedItemDisplayList.spec.ts deleted file mode 100644 index 2b1d7e455..000000000 --- a/tests/javascript/unit/components/FeedItemDisplayList.spec.ts +++ /dev/null @@ -1,66 +0,0 @@ -import Vuex, { Store } from 'vuex' -import { shallowMount, createLocalVue, Wrapper } from '@vue/test-utils' - -import FeedItemDisplayList from '../../../../src/components/FeedItemDisplayList.vue' -import VirtualScroll from '../../../../src/components/VirtualScroll.vue' -import FeedItemRow from '../../../../src/components/FeedItemRow.vue' - -jest.mock('@nextcloud/axios') - -describe('FeedItemDisplayList.vue', () => { - 'use strict' - const localVue = createLocalVue() - localVue.use(Vuex) - let wrapper: Wrapper - - const mockItem = { - feedId: 1, - title: 'feed item', - pubDate: Date.now() / 1000, - } - - let store: Store - beforeAll(() => { - store = new Vuex.Store({ - state: { - items: { - allItemsLoaded: { - unread: false, - }, - }, - }, - actions: { - }, - getters: { - unread: () => [mockItem, mockItem], - }, - }) - - store.dispatch = jest.fn() - store.commit = jest.fn() - - wrapper = shallowMount(FeedItemDisplayList, { - propsData: { - items: [mockItem], - fetchKey: 'unread', - }, - localVue, - store, - }) - }) - - it('should create FeedItemRow items from input', () => { - expect((wrapper.findComponent(VirtualScroll)).findAllComponents(FeedItemRow).length).toEqual(1) - - wrapper = shallowMount(FeedItemDisplayList, { - propsData: { - items: [mockItem, mockItem], - fetchKey: 'unread', - }, - localVue, - store, - }) - expect((wrapper.findComponent(VirtualScroll)).findAllComponents(FeedItemRow).length).toEqual(2) - }) - -}) diff --git a/tests/javascript/unit/components/FeedItemRow.spec.ts b/tests/javascript/unit/components/FeedItemRow.spec.ts deleted file mode 100644 index dde0106a9..000000000 --- a/tests/javascript/unit/components/FeedItemRow.spec.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { shallowMount, createLocalVue, Wrapper } from '@vue/test-utils' - -import FeedItemRow from '../../../../src/components/FeedItemRow.vue' -import { ACTIONS } from '../../../../src/store' - -describe('FeedItemRow.vue', () => { - 'use strict' - const localVue = createLocalVue() - let wrapper: Wrapper - - const mockItem = { - feedId: 1, - title: 'feed item', - pubDate: Date.now() / 1000, - } - const mockFeed = { - id: 1, - } - - const dispatchStub = jest.fn() - beforeAll(() => { - wrapper = shallowMount(FeedItemRow, { - propsData: { - item: mockItem, - }, - localVue, - mocks: { - $store: { - getters: { - feeds: [mockFeed], - }, - state: { - feeds: [], - folders: [], - }, - dispatch: dispatchStub, - commit: jest.fn(), - }, - }, - }) - }) - - beforeEach(() => { - dispatchStub.mockReset() - }) - - it('should initialize without expanded and without keepUnread', () => { - expect(wrapper.vm.$data.keepUnread).toBeFalsy() - }) - - it('should format date to match locale', () => { - const epoch = Date.now() // Provide an epoch timestamp - const formattedDate = (wrapper.vm as any).formatDate(epoch) - - expect(formattedDate).toEqual(new Date(epoch).toLocaleString()) - }) - - it('should format datetime to match international standard', () => { - const epoch = Date.now() // Provide an epoch timestamp - const formattedDate = (wrapper.vm as any).formatDatetime(epoch) - - expect(formattedDate).toEqual(new Date(epoch).toISOString()) - }) - - it('should calculate relative timestamp correctly', () => { - const currentTimestamp = Date.now() - let pastTimestamp = currentTimestamp - 1000 * 10 // 10 seconds ago - - let relativeTimestamp = (wrapper.vm as any).getRelativeTimestamp(pastTimestamp) - - expect(relativeTimestamp).toEqual('10 seconds') - - pastTimestamp = currentTimestamp - 1000 * 60 * 10 // 10 minutes ago - - relativeTimestamp = (wrapper.vm as any).getRelativeTimestamp(pastTimestamp) - - expect(relativeTimestamp).toEqual('10 minutes ago') - }) - - it('should retrieve feed by ID', () => { - const feed = (wrapper.vm as any).getFeed(mockFeed.id) - - expect(feed).toEqual(mockFeed) - }) - - describe('markRead', () => { - it('should mark item as read when keepUnread is false', () => { - wrapper.vm.$data.keepUnread = false; - (wrapper.vm as any).markRead(wrapper.vm.$props.item) - - expect(dispatchStub).toHaveBeenCalledWith(ACTIONS.MARK_READ, { - item: wrapper.vm.$props.item, - }) - }) - - it('should not mark item as read when keepUnread is true', () => { - wrapper.vm.$data.keepUnread = true; - (wrapper.vm as any).markRead(wrapper.vm.$data.item) - - expect(dispatchStub).not.toHaveBeenCalled() - }) - }) - - it('toggles keepUnread state', () => { - const initialKeepUnread = wrapper.vm.$data.keepUnread; - (wrapper.vm as any).toggleKeepUnread(wrapper.vm.$data.item) - const updatedKeepUnread = wrapper.vm.$data.keepUnread - - expect(updatedKeepUnread).toBe(!initialKeepUnread) - }) - - it('toggles starred state', () => { - wrapper.vm.$props.item.starred = true; - - (wrapper.vm as any).toggleStarred(wrapper.vm.$props.item) - expect(dispatchStub).toHaveBeenCalledWith(ACTIONS.UNSTAR_ITEM, { - item: wrapper.vm.$props.item, - }) - - wrapper.vm.$props.item.starred = false; - - (wrapper.vm as any).toggleStarred(wrapper.vm.$props.item) - expect(dispatchStub).toHaveBeenCalledWith(ACTIONS.STAR_ITEM, { - item: wrapper.vm.$props.item, - }) - }) -}) diff --git a/tests/javascript/unit/components/feed-display/FeedItemDisplay.spec.ts b/tests/javascript/unit/components/feed-display/FeedItemDisplay.spec.ts new file mode 100644 index 000000000..a75119414 --- /dev/null +++ b/tests/javascript/unit/components/feed-display/FeedItemDisplay.spec.ts @@ -0,0 +1,92 @@ +import { shallowMount, createLocalVue, Wrapper } from '@vue/test-utils' + +import FeedItemDisplay from '../../../../../src/components/feed-display/FeedItemDisplay.vue' +import { ACTIONS, MUTATIONS } from '../../../../../src/store' + +describe('FeedItemDisplay.vue', () => { + 'use strict' + const localVue = createLocalVue() + let wrapper: Wrapper + + const mockItem = { + feedId: 1, + title: 'feed item', + pubDate: Date.now() / 1000, + } + const mockFeed = { + id: 1, + } + + const dispatchStub = jest.fn() + const commitStub = jest.fn() + beforeAll(() => { + wrapper = shallowMount(FeedItemDisplay, { + propsData: { + item: mockItem, + }, + localVue, + mocks: { + $store: { + getters: { + feeds: [mockFeed], + }, + state: { + feeds: [], + folders: [], + }, + dispatch: dispatchStub, + commit: commitStub, + }, + }, + }) + }) + + beforeEach(() => { + dispatchStub.mockReset() + commitStub.mockReset() + }) + + it('should send SET_SELECTED_ITEM with undefined id', () => { + (wrapper.vm as any).clearSelected() + + expect(commitStub).toBeCalledWith(MUTATIONS.SET_SELECTED_ITEM, { id: undefined }) + }) + + it('should format date to match locale', () => { + const epoch = Date.now() // Provide an epoch timestamp + const formattedDate = (wrapper.vm as any).formatDate(epoch) + + expect(formattedDate).toEqual(new Date(epoch).toLocaleString()) + }) + + it('should format datetime to match international standard', () => { + const epoch = Date.now() // Provide an epoch timestamp + const formattedDate = (wrapper.vm as any).formatDatetime(epoch) + + expect(formattedDate).toEqual(new Date(epoch).toISOString()) + }) + + it('should retrieve feed by ID', () => { + const feed = (wrapper.vm as any).getFeed(mockFeed.id) + + expect(feed).toEqual(mockFeed) + }) + + it('toggles starred state', () => { + wrapper.vm.$props.item.starred = true; + + (wrapper.vm as any).toggleStarred(wrapper.vm.$props.item) + expect(dispatchStub).toHaveBeenCalledWith(ACTIONS.UNSTAR_ITEM, { + item: wrapper.vm.$props.item, + }) + + wrapper.vm.$props.item.starred = false; + + (wrapper.vm as any).toggleStarred(wrapper.vm.$props.item) + expect(dispatchStub).toHaveBeenCalledWith(ACTIONS.STAR_ITEM, { + item: wrapper.vm.$props.item, + }) + }) + + // TODO: Audio/Video tests +}) diff --git a/tests/javascript/unit/components/feed-display/FeedItemDisplayList.spec.ts b/tests/javascript/unit/components/feed-display/FeedItemDisplayList.spec.ts new file mode 100644 index 000000000..cd11b7ea9 --- /dev/null +++ b/tests/javascript/unit/components/feed-display/FeedItemDisplayList.spec.ts @@ -0,0 +1,66 @@ +import Vuex, { Store } from 'vuex' +import { shallowMount, createLocalVue, Wrapper } from '@vue/test-utils' + +import FeedItemDisplayList from '../../../../../src/components/feed-display/FeedItemDisplayList.vue' +import VirtualScroll from '../../../../../src/components/feed-display/VirtualScroll.vue' +import FeedItemRow from '../../../../../src/components/feed-display/FeedItemRow.vue' + +jest.mock('@nextcloud/axios') + +describe('FeedItemDisplayList.vue', () => { + 'use strict' + const localVue = createLocalVue() + localVue.use(Vuex) + let wrapper: Wrapper + + const mockItem = { + feedId: 1, + title: 'feed item', + pubDate: Date.now() / 1000, + } + + let store: Store + beforeAll(() => { + store = new Vuex.Store({ + state: { + items: { + allItemsLoaded: { + unread: false, + }, + }, + }, + actions: { + }, + getters: { + unread: () => [mockItem, mockItem], + }, + }) + + store.dispatch = jest.fn() + store.commit = jest.fn() + + wrapper = shallowMount(FeedItemDisplayList, { + propsData: { + items: [mockItem], + fetchKey: 'unread', + }, + localVue, + store, + }) + }) + + it('should create FeedItemRow items from input', () => { + expect((wrapper.findComponent(VirtualScroll)).findAllComponents(FeedItemRow).length).toEqual(1) + + wrapper = shallowMount(FeedItemDisplayList, { + propsData: { + items: [mockItem, mockItem], + fetchKey: 'unread', + }, + localVue, + store, + }) + expect((wrapper.findComponent(VirtualScroll)).findAllComponents(FeedItemRow).length).toEqual(2) + }) + +}) diff --git a/tests/javascript/unit/components/feed-display/FeedItemRow.spec.ts b/tests/javascript/unit/components/feed-display/FeedItemRow.spec.ts new file mode 100644 index 000000000..d6aa2cd9d --- /dev/null +++ b/tests/javascript/unit/components/feed-display/FeedItemRow.spec.ts @@ -0,0 +1,127 @@ +import { shallowMount, createLocalVue, Wrapper } from '@vue/test-utils' + +import FeedItemRow from '../../../../../src/components/feed-display/FeedItemRow.vue' +import { ACTIONS } from '../../../../../src/store' + +describe('FeedItemRow.vue', () => { + 'use strict' + const localVue = createLocalVue() + let wrapper: Wrapper + + const mockItem = { + feedId: 1, + title: 'feed item', + pubDate: Date.now() / 1000, + } + const mockFeed = { + id: 1, + } + + const dispatchStub = jest.fn() + beforeAll(() => { + wrapper = shallowMount(FeedItemRow, { + propsData: { + item: mockItem, + }, + localVue, + mocks: { + $store: { + getters: { + feeds: [mockFeed], + }, + state: { + feeds: [], + folders: [], + }, + dispatch: dispatchStub, + commit: jest.fn(), + }, + }, + }) + }) + + beforeEach(() => { + dispatchStub.mockReset() + }) + + it('should initialize without expanded and without keepUnread', () => { + expect(wrapper.vm.$data.keepUnread).toBeFalsy() + }) + + it('should format date to match locale', () => { + const epoch = Date.now() // Provide an epoch timestamp + const formattedDate = (wrapper.vm as any).formatDate(epoch) + + expect(formattedDate).toEqual(new Date(epoch).toLocaleString()) + }) + + it('should format datetime to match international standard', () => { + const epoch = Date.now() // Provide an epoch timestamp + const formattedDate = (wrapper.vm as any).formatDatetime(epoch) + + expect(formattedDate).toEqual(new Date(epoch).toISOString()) + }) + + it('should calculate relative timestamp correctly', () => { + const currentTimestamp = Date.now() + let pastTimestamp = currentTimestamp - 1000 * 10 // 10 seconds ago + + let relativeTimestamp = (wrapper.vm as any).getRelativeTimestamp(pastTimestamp) + + expect(relativeTimestamp).toEqual('10 seconds') + + pastTimestamp = currentTimestamp - 1000 * 60 * 10 // 10 minutes ago + + relativeTimestamp = (wrapper.vm as any).getRelativeTimestamp(pastTimestamp) + + expect(relativeTimestamp).toEqual('10 minutes ago') + }) + + it('should retrieve feed by ID', () => { + const feed = (wrapper.vm as any).getFeed(mockFeed.id) + + expect(feed).toEqual(mockFeed) + }) + + describe('markRead', () => { + it('should mark item as read when keepUnread is false', () => { + wrapper.vm.$data.keepUnread = false; + (wrapper.vm as any).markRead(wrapper.vm.$props.item) + + expect(dispatchStub).toHaveBeenCalledWith(ACTIONS.MARK_READ, { + item: wrapper.vm.$props.item, + }) + }) + + it('should not mark item as read when keepUnread is true', () => { + wrapper.vm.$data.keepUnread = true; + (wrapper.vm as any).markRead(wrapper.vm.$data.item) + + expect(dispatchStub).not.toHaveBeenCalled() + }) + }) + + it('toggles keepUnread state', () => { + const initialKeepUnread = wrapper.vm.$data.keepUnread; + (wrapper.vm as any).toggleKeepUnread(wrapper.vm.$data.item) + const updatedKeepUnread = wrapper.vm.$data.keepUnread + + expect(updatedKeepUnread).toBe(!initialKeepUnread) + }) + + it('toggles starred state', () => { + wrapper.vm.$props.item.starred = true; + + (wrapper.vm as any).toggleStarred(wrapper.vm.$props.item) + expect(dispatchStub).toHaveBeenCalledWith(ACTIONS.UNSTAR_ITEM, { + item: wrapper.vm.$props.item, + }) + + wrapper.vm.$props.item.starred = false; + + (wrapper.vm as any).toggleStarred(wrapper.vm.$props.item) + expect(dispatchStub).toHaveBeenCalledWith(ACTIONS.STAR_ITEM, { + item: wrapper.vm.$props.item, + }) + }) +}) -- cgit v1.2.3