diff --git a/.eslintrc.js b/.eslintrc.js
index 465c04bcf..94f517ea6 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -196,6 +196,7 @@ module.exports = {
'webpack/**',
'app/soapbox/test_setup.js',
'app/**/__tests__/**',
+ 'app/**/__mocks__/**',
],
},
],
diff --git a/app/soapbox/__mocks__/api.js b/app/soapbox/__mocks__/api.js
new file mode 100644
index 000000000..9f841d2bd
--- /dev/null
+++ b/app/soapbox/__mocks__/api.js
@@ -0,0 +1,10 @@
+import MockAdapter from 'axios-mock-adapter';
+
+const api = jest.requireActual('../api').default;
+
+export default (...params) => {
+ const axiosInstance = api(...params);
+ const mock = new MockAdapter(axiosInstance);
+ mock.onGet('/instance/about/index.html').reply(200, '
Hello world
');
+ return axiosInstance;
+};
diff --git a/app/soapbox/actions/__tests__/about-test.js b/app/soapbox/actions/__tests__/about-test.js
new file mode 100644
index 000000000..df0a84572
--- /dev/null
+++ b/app/soapbox/actions/__tests__/about-test.js
@@ -0,0 +1,25 @@
+import configureMockStore from 'redux-mock-store';
+import thunk from 'redux-thunk';
+import {
+ FETCH_ABOUT_PAGE_REQUEST,
+ FETCH_ABOUT_PAGE_SUCCESS,
+ fetchAboutPage,
+} from '../about';
+import { Map as ImmutableMap } from 'immutable';
+
+const middlewares = [thunk];
+const mockStore = configureMockStore(middlewares);
+
+describe('About actions', () => {
+ it('creates FETCH_ABOUT_PAGE_SUCCESS when fetching about page has been done', () => {
+ const expectedActions = [
+ { type: FETCH_ABOUT_PAGE_REQUEST, slug: 'index' },
+ { type: FETCH_ABOUT_PAGE_SUCCESS, slug: 'index' },
+ ];
+ const store = mockStore(ImmutableMap());
+
+ return store.dispatch(fetchAboutPage()).then(() => {
+ expect(store.getActions()).toEqual(expectedActions);
+ });
+ });
+});
diff --git a/app/soapbox/actions/about.js b/app/soapbox/actions/about.js
index df81283c9..81c162b6b 100644
--- a/app/soapbox/actions/about.js
+++ b/app/soapbox/actions/about.js
@@ -1,12 +1,15 @@
import api from '../api';
export const FETCH_ABOUT_PAGE_REQUEST = 'FETCH_ABOUT_PAGE_REQUEST';
+export const FETCH_ABOUT_PAGE_SUCCESS = 'FETCH_ABOUT_PAGE_SUCCESS';
export const FETCH_ABOUT_PAGE_FAIL = 'FETCH_ABOUT_PAGE_FAIL';
export function fetchAboutPage(slug = 'index') {
return (dispatch, getState) => {
dispatch({ type: FETCH_ABOUT_PAGE_REQUEST, slug });
- return api(getState).get(`/instance/about/${slug}.html`).catch(error => {
+ return api(getState).get(`/instance/about/${slug}.html`).then(() => {
+ dispatch({ type: FETCH_ABOUT_PAGE_SUCCESS, slug });
+ }).catch(error => {
dispatch({ type: FETCH_ABOUT_PAGE_FAIL, slug });
});
};
diff --git a/app/soapbox/api.js b/app/soapbox/api.js
index 1c3a666cf..f65971e64 100644
--- a/app/soapbox/api.js
+++ b/app/soapbox/api.js
@@ -5,11 +5,7 @@ import LinkHeader from 'http-link-header';
export const getLinks = response => {
const value = response.headers.link;
-
- if (!value) {
- return { refs: [] };
- }
-
+ if (!value) return { refs: [] };
return LinkHeader.parse(value);
};
diff --git a/app/soapbox/test_setup.js b/app/soapbox/test_setup.js
index 655ce97e9..297c64d7d 100644
--- a/app/soapbox/test_setup.js
+++ b/app/soapbox/test_setup.js
@@ -5,3 +5,5 @@ import Adapter from 'enzyme-adapter-react-16';
const adapter = new Adapter();
configure({ adapter });
+
+jest.mock('soapbox/api');
diff --git a/package.json b/package.json
index 430448a94..ab1ba1316 100644
--- a/package.json
+++ b/package.json
@@ -146,6 +146,7 @@
"websocket.js": "^0.1.12"
},
"devDependencies": {
+ "axios-mock-adapter": "^1.18.1",
"babel-eslint": "^10.1.0",
"babel-jest": "^24.8.0",
"enzyme": "^3.8.0",
@@ -159,6 +160,7 @@
"raf": "^3.4.1",
"react-intl-translations-manager": "^5.0.3",
"react-test-renderer": "^16.7.0",
+ "redux-mock-store": "^1.5.4",
"sass-lint": "^1.13.1",
"webpack-dev-server": "^3.5.1",
"yargs": "^15.0.0"
diff --git a/yarn.lock b/yarn.lock
index 55263a789..3c1682f13 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2313,6 +2313,14 @@ aws4@^1.8.0:
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
+axios-mock-adapter@^1.18.1:
+ version "1.18.1"
+ resolved "https://registry.yarnpkg.com/axios-mock-adapter/-/axios-mock-adapter-1.18.1.tgz#a2ba2638ef513d954793f96bde3e26bd4a1b7940"
+ integrity sha512-kFBZsG1Ma5yxjRGHq5KuuL55mPb7WzFULhypquEhzPg8SH5CXICb+qwC2CCA5u+GQVpiqGPwKSRkd3mBCs6gdw==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ is-buffer "^2.0.3"
+
axios@^0.19.0:
version "0.19.0"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8"
@@ -6168,6 +6176,11 @@ is-buffer@^2.0.2:
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==
+is-buffer@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623"
+ integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==
+
is-builtin-module@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
@@ -7371,6 +7384,11 @@ lodash.isobject@^3.0.2:
resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d"
integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=
+lodash.isplainobject@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+ integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
+
lodash.kebabcase@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
@@ -9847,6 +9865,13 @@ redux-immutable@^4.0.0:
resolved "https://registry.yarnpkg.com/redux-immutable/-/redux-immutable-4.0.0.tgz#3a1a32df66366462b63691f0e1dc35e472bbc9f3"
integrity sha1-Ohoy32Y2ZGK2NpHw4dw15HK7yfM=
+redux-mock-store@^1.5.4:
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/redux-mock-store/-/redux-mock-store-1.5.4.tgz#90d02495fd918ddbaa96b83aef626287c9ab5872"
+ integrity sha512-xmcA0O/tjCLXhh9Fuiq6pMrJCwFRaouA8436zcikdIpYWWCjU76CRk+i2bHx8EeiSiMGnB85/lZdU3wIJVXHTA==
+ dependencies:
+ lodash.isplainobject "^4.0.6"
+
redux-thunk@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"