test: Add tests

This commit is contained in:
Simone Busoli 2019-05-26 20:54:06 +02:00
parent cbc82854a6
commit a1412a584f
8 changed files with 3249 additions and 432 deletions

View File

@ -7,6 +7,6 @@ module.exports = {
plugins: [
['@babel/proposal-object-rest-spread', { loose }],
cjs && ['@babel/transform-modules-commonjs', { loose }],
['@babel/transform-runtime', { useESModules: !cjs }],
].filter(Boolean),
}
['@babel/transform-runtime', { useESModules: !cjs }]
].filter(Boolean)
}

View File

@ -11,7 +11,8 @@
},
"env": {
"browser": true,
"node": true
"node": true,
"jest": true
},
"globals": {
"Promise": true
@ -19,7 +20,5 @@
"rules": {
"valid-jsdoc": 2
},
"plugins": [
"import"
]
}
"plugins": ["import"]
}

View File

@ -1,7 +1,9 @@
language: node_js
node_js: 11
sudo: false
script: npm run lint
script:
- npm run lint
- npm test
deploy:
skip_cleanup: true
provider: script

8
__mocks__/axios.js Normal file
View File

@ -0,0 +1,8 @@
module.exports = mockAxios
function mockAxios() {
return new Promise((resolve, reject) => {
mockAxios.resolvePromise = resolve
mockAxios.rejectPromise = reject
})
}

185
jest.config.js Normal file
View File

@ -0,0 +1,185 @@
// For a detailed explanation regarding each configuration property, visit:
// https://jestjs.io/docs/en/configuration.html
module.exports = {
// All imported modules in your tests should be mocked automatically
// automock: false,
// Stop running tests after `n` failures
// bail: 0,
// Respect "browser" field in package.json when resolving modules
// browser: false,
// The directory where Jest should store its cached dependency information
// cacheDirectory: "C:\\Users\\simone\\AppData\\Local\\Temp\\jest",
// Automatically clear mock calls and instances between every test
clearMocks: true,
// Indicates whether the coverage information should be collected while executing the test
// collectCoverage: false,
// An array of glob patterns indicating a set of files for which coverage information should be collected
// collectCoverageFrom: null,
// The directory where Jest should output its coverage files
coverageDirectory: 'coverage'
// An array of regexp pattern strings used to skip coverage collection
// coveragePathIgnorePatterns: [
// "\\\\node_modules\\\\"
// ],
// A list of reporter names that Jest uses when writing coverage reports
// coverageReporters: [
// "json",
// "text",
// "lcov",
// "clover"
// ],
// An object that configures minimum threshold enforcement for coverage results
// coverageThreshold: null,
// A path to a custom dependency extractor
// dependencyExtractor: null,
// Make calling deprecated APIs throw helpful error messages
// errorOnDeprecated: false,
// Force coverage collection from ignored files using an array of glob patterns
// forceCoverageMatch: [],
// A path to a module which exports an async function that is triggered once before all test suites
// globalSetup: null,
// A path to a module which exports an async function that is triggered once after all test suites
// globalTeardown: null,
// A set of global variables that need to be available in all test environments
// globals: {},
// An array of directory names to be searched recursively up from the requiring module's location
// moduleDirectories: [
// "node_modules"
// ],
// An array of file extensions your modules use
// moduleFileExtensions: [
// "js",
// "json",
// "jsx",
// "ts",
// "tsx",
// "node"
// ],
// A map from regular expressions to module names that allow to stub out resources with a single module
// moduleNameMapper: {},
// An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
// modulePathIgnorePatterns: [],
// Activates notifications for test results
// notify: false,
// An enum that specifies notification mode. Requires { notify: true }
// notifyMode: "failure-change",
// A preset that is used as a base for Jest's configuration
// preset: null,
// Run tests from one or more projects
// projects: null,
// Use this configuration option to add custom reporters to Jest
// reporters: undefined,
// Automatically reset mock state between every test
// resetMocks: false,
// Reset the module registry before running each individual test
// resetModules: false,
// A path to a custom resolver
// resolver: null,
// Automatically restore mock state between every test
// restoreMocks: false,
// The root directory that Jest should scan for tests and modules within
// rootDir: null,
// A list of paths to directories that Jest should use to search for files in
// roots: [
// "<rootDir>"
// ],
// Allows you to use a custom runner instead of Jest's default test runner
// runner: "jest-runner",
// The paths to modules that run some code to configure or set up the testing environment before each test
// setupFiles: [],
// A list of paths to modules that run some code to configure or set up the testing framework before each test
// setupFilesAfterEnv: [],
// A list of paths to snapshot serializer modules Jest should use for snapshot testing
// snapshotSerializers: [],
// The test environment that will be used for testing
// testEnvironment: "jest-environment-jsdom",
// Options that will be passed to the testEnvironment
// testEnvironmentOptions: {},
// Adds a location field to test results
// testLocationInResults: false,
// The glob patterns Jest uses to detect test files
// testMatch: [
// "**/__tests__/**/*.[jt]s?(x)",
// "**/?(*.)+(spec|test).[tj]s?(x)"
// ],
// An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
// testPathIgnorePatterns: [
// "\\\\node_modules\\\\"
// ],
// The regexp pattern or array of patterns that Jest uses to detect test files
// testRegex: [],
// This option allows the use of a custom results processor
// testResultsProcessor: null,
// This option allows use of a custom test runner
// testRunner: "jasmine2",
// This option sets the URL for the jsdom environment. It is reflected in properties such as location.href
// testURL: "http://localhost",
// Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout"
// timers: "real",
// A map from regular expressions to paths to transformers
// transform: null,
// An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
// transformIgnorePatterns: [
// "\\\\node_modules\\\\"
// ],
// An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
// unmockedModulePathPatterns: undefined,
// Indicates whether each individual test should be reported during the run
// verbose: null,
// An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode
// watchPathIgnorePatterns: [],
// Whether to use watchman for file crawling
// watchman: true,
}

3351
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -20,18 +20,19 @@
"src"
],
"scripts": {
"build:commonjs": "cross-env BABEL_ENV=commonjs babel src --out-dir lib",
"build:es": "babel src --out-dir es",
"build:commonjs": "cross-env BABEL_ENV=commonjs babel src/index.js --out-dir lib",
"build:es": "babel src/index.js --out-dir es",
"build": "run-p build:*",
"clean": "rimraf lib es coverage",
"format": "prettier --write \"src/**/*.{js,md}\"",
"lint": "eslint src",
"prepare": "npm run clean && npm run build",
"prepublishOnly": "npm run build",
"release": "standard-version"
"release": "standard-version",
"test": "jest"
},
"dependencies": {
"@babel/runtime": "^7.3.1",
"@babel/runtime": "^7.4.5",
"lru-cache": "^5.1.1"
},
"peerDependencies": {
@ -39,24 +40,27 @@
"axios": "^0.18.0"
},
"devDependencies": {
"@babel/cli": "^7.2.3",
"@babel/core": "^7.3.3",
"@babel/plugin-transform-runtime": "^7.2.0",
"@babel/preset-env": "^7.3.1",
"@babel/cli": "^7.4.4",
"@babel/core": "^7.4.5",
"@babel/plugin-transform-runtime": "^7.4.4",
"@babel/preset-env": "^7.4.5",
"axios": "^0.18.0",
"babel-eslint": "^10.0.1",
"cross-env": "^5.2.0",
"cz-conventional-changelog": "^2.1.0",
"eslint": "^5.14.0",
"eslint-config-prettier": "^4.0.0",
"eslint-plugin-import": "^2.16.0",
"eslint-plugin-prettier": "^3.0.1",
"eslint": "^5.16.0",
"eslint-config-prettier": "^4.3.0",
"eslint-plugin-import": "^2.17.3",
"eslint-plugin-prettier": "^3.1.0",
"husky": "^1.3.1",
"lint-staged": "^8.1.4",
"jest": "^24.8.0",
"lint-staged": "^8.1.7",
"npm-run-all": "^4.1.5",
"prettier": "^1.16.4",
"react": "^16.8.2",
"react-dom": "^16.8.2",
"prettier": "^1.17.1",
"react": "^16.8.6",
"react-dom": "^16.8.6",
"react-hooks-testing-library": "^0.5.0",
"react-test-renderer": "^16.8.6",
"rimraf": "^2.6.3",
"standard-version": "^6.0.1"
},

82
src/index.test.js Normal file
View File

@ -0,0 +1,82 @@
import { renderHook, act } from 'react-hooks-testing-library'
import axios from 'axios'
import useAxios from './'
test('should set loading to true', async () => {
const { result } = renderHook(() => useAxios())
expect(result.current[0].loading).toBe(true)
})
test('should set loading to false when request completes and return data', async () => {
const { result, waitForNextUpdate } = renderHook(() => useAxios())
act(() => {
axios.resolvePromise({ data: 'whatever' })
})
await waitForNextUpdate()
expect(result.current[0].loading).toBe(false)
expect(result.current[0].data).toBe('whatever')
})
test('should set loading to false when request completes and return error', async () => {
const { result, waitForNextUpdate } = renderHook(() => useAxios())
const error = new Error('boom')
act(() => {
axios.rejectPromise(error)
})
await waitForNextUpdate()
expect(result.current[0].loading).toBe(false)
expect(result.current[0].error).toBe(error)
})
test('should refetch', async () => {
const { result, waitForNextUpdate } = renderHook(() => useAxios())
act(() => {
axios.resolvePromise({ data: 'whatever' })
})
await waitForNextUpdate()
act(() => {
result.current[1]()
})
expect(result.current[0].loading).toBe(true)
})
describe('manual option', () => {
test('should set loading to false', async () => {
const { result } = renderHook(() => useAxios('', { manual: true }))
expect(result.current[0].loading).toBe(false)
})
test('should execute request manually', async () => {
const { result, waitForNextUpdate } = renderHook(() =>
useAxios('', { manual: true })
)
act(() => {
result.current[1]()
})
expect(result.current[0].loading).toBe(true)
act(() => {
axios.resolvePromise({ data: 'whatever' })
})
await waitForNextUpdate()
expect(result.current[0].loading).toBe(false)
expect(result.current[0].data).toBe('whatever')
})
})