diff --git a/package.json b/package.json index 94de8910..44b77f43 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "/resources/assets/tests/setup", "/resources/assets/tests/utils" ], - "testRegex": "resources/assets/tests/.*\\.(spec|test)\\.js" + "testRegex": "resources/assets/tests/.*\\.(spec|test)\\.js$" }, "serve": { "clipboard": false, diff --git a/resources/assets/src/js/check-updates.js b/resources/assets/src/js/check-updates.js index 72614304..53d86685 100644 --- a/resources/assets/src/js/check-updates.js +++ b/resources/assets/src/js/check-updates.js @@ -1,6 +1,7 @@ +import $ from 'jquery'; import { init } from './net'; -async function checkForUpdates() { +export async function checkForUpdates() { const response = await fetch(`${blessing.base_url}/admin/update/check`, init); if (response.ok) { @@ -13,7 +14,7 @@ async function checkForUpdates() { } } -async function checkForPluginUpdates() { +export async function checkForPluginUpdates() { const response = await fetch(`${blessing.base_url}/admin/plugins/market/check`, init); if (response.ok) { diff --git a/resources/assets/src/js/feedback.js b/resources/assets/src/js/feedback.js index b61f0cbf..3979ac58 100644 --- a/resources/assets/src/js/feedback.js +++ b/resources/assets/src/js/feedback.js @@ -1,6 +1,6 @@ import { queryStringify } from './utils'; -async function sendFeedback() { +export async function sendFeedback() { if (document.cookie.replace(/(?:(?:^|.*;\s*)feedback_sent\s*=\s*([^;]*).*$)|^.*$/, '$1')) { return; } diff --git a/resources/assets/src/js/logout.js b/resources/assets/src/js/logout.js index 78ad5743..4157d08b 100644 --- a/resources/assets/src/js/logout.js +++ b/resources/assets/src/js/logout.js @@ -1,3 +1,4 @@ +import $ from 'jquery'; import { post } from './net'; import { swal } from './notify'; import { trans } from './i18n'; diff --git a/resources/assets/tests/js/__snapshots__/feedback.test.js.snap b/resources/assets/tests/js/__snapshots__/feedback.test.js.snap new file mode 100644 index 00000000..3e4244ab --- /dev/null +++ b/resources/assets/tests/js/__snapshots__/feedback.test.js.snap @@ -0,0 +1,16 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`send feedback 1`] = ` +Array [ + "https://work.prinzeugen.net/statistics/feedback", + Object { + "body": "site_name=Blessing%20Skin&site_url=&version=4.0.0", + "headers": Object { + "Accept": "application/json", + "Content-Type": "application/x-www-form-urlencoded", + }, + "method": "POST", + "mode": "cors", + }, +] +`; diff --git a/resources/assets/tests/js/check-updates.test.js b/resources/assets/tests/js/check-updates.test.js new file mode 100644 index 00000000..278a3283 --- /dev/null +++ b/resources/assets/tests/js/check-updates.test.js @@ -0,0 +1,59 @@ +import { + checkForUpdates, + checkForPluginUpdates +} from '@/js/check-updates'; +import { init } from '@/js/net'; + +test('check for BS updates', async () => { + window.fetch = jest.fn() + .mockResolvedValueOnce({ ok: false }) + .mockResolvedValueOnce({ + ok: true, + json: () => Promise.resolve({ available: false }) + }) + .mockResolvedValueOnce({ + ok: true, + json: () => Promise.resolve({ available: true, latest: '4.0.0' }) + }); + + document.body.innerHTML = ` + + `; + + await checkForUpdates(); + expect(window.fetch).toBeCalledWith('/admin/update/check', init); + expect(document.querySelector('a').innerHTML).toBe(''); + + await checkForUpdates(); + expect(document.querySelector('a').innerHTML).toBe(''); + + await checkForUpdates(); + expect(document.querySelector('a').innerHTML).toContain('4.0.0'); +}); + +test('check for plugins updates', async () => { + window.fetch = jest.fn() + .mockResolvedValueOnce({ ok: false }) + .mockResolvedValueOnce({ + ok: true, + json: () => Promise.resolve({ available: false }) + }) + .mockResolvedValueOnce({ + ok: true, + json: () => Promise.resolve({ available: true, plugins: [{}] }) + }); + + document.body.innerHTML = ` + + `; + + await checkForPluginUpdates(); + expect(window.fetch).toBeCalledWith('/admin/plugins/market/check', init); + expect(document.querySelector('a').innerHTML).toBe(''); + + await checkForPluginUpdates(); + expect(document.querySelector('a').innerHTML).toBe(''); + + await checkForPluginUpdates(); + expect(document.querySelector('a').innerHTML).toContain('1'); +}); diff --git a/resources/assets/tests/js/feedback.test.js b/resources/assets/tests/js/feedback.test.js new file mode 100644 index 00000000..bf5a67a2 --- /dev/null +++ b/resources/assets/tests/js/feedback.test.js @@ -0,0 +1,28 @@ +import { sendFeedback } from '@/js/feedback'; + +test('send feedback', async () => { + window.fetch = jest.fn() + .mockResolvedValueOnce({ ok: false }) + .mockResolvedValueOnce({ + ok: true, + json: () => Promise.resolve({ errno: 1 }) + }) + .mockResolvedValue({ + ok: true, + json: () => Promise.resolve({ errno: 0 }) + }); + + await sendFeedback(); + expect(document.cookie).toBe(''); + expect(fetch.mock.calls[0]).toMatchSnapshot(); + + await sendFeedback(); + expect(document.cookie).toBe(''); + + await sendFeedback(); + expect(document.cookie).toStartWith('feedback_sent='); + + window.fetch.mockClear(); + await sendFeedback(); + expect(window.fetch).not.toBeCalled(); +}); diff --git a/resources/assets/tests/js/logout.test.js b/resources/assets/tests/js/logout.test.js new file mode 100644 index 00000000..d05ea9f6 --- /dev/null +++ b/resources/assets/tests/js/logout.test.js @@ -0,0 +1,18 @@ +import { logout } from '@/js/logout'; +import { post } from '@/js/net'; +import { swal } from '@/js/notify'; + +jest.mock('@/js/net'); +jest.mock('@/js/notify'); + +test('log out', async () => { + swal.mockResolvedValueOnce({ dismiss: 1 }).mockResolvedValueOnce({}); + post.mockResolvedValue({ msg: '' }); + + await logout(); + expect(post).not.toBeCalled(); + + await logout(); + expect(post).toBeCalledWith('/auth/logout'); + jest.runAllTimers(); +}); diff --git a/resources/assets/tests/setup.js b/resources/assets/tests/setup.js index 5d5fc17d..9ee4acd3 100644 --- a/resources/assets/tests/setup.js +++ b/resources/assets/tests/setup.js @@ -3,10 +3,12 @@ import Vue from 'vue'; window.blessing = { base_url: '', - site_name: 'Blessing Skin' + site_name: 'Blessing Skin', + version: '4.0.0' }; -console.log = console.warn = console.error = () => {}; +const noop = () => undefined; +Object.keys(console).forEach(method => console[method] = noop); Vue.prototype.$t = key => key;