add test
This commit is contained in:
		
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -6,8 +6,8 @@ yarn-debug.log* | ||||
| yarn-error.log* | ||||
| **/*.log | ||||
|  | ||||
| test/unit/coverage | ||||
| test/e2e/reports | ||||
| tests/**/coverage/ | ||||
| tests/e2e/reports | ||||
| selenium-debug.log | ||||
|  | ||||
| # Editor directories and files | ||||
|   | ||||
| @@ -1,14 +1,5 @@ | ||||
| module.exports = { | ||||
|   presets: [ | ||||
|     ['@vue/app', { modules: 'commonjs' }] | ||||
|   ], | ||||
|   plugins: [], | ||||
|   env: { | ||||
|     test: { | ||||
|       presets: [ | ||||
|         ['@vue/app', { modules: 'commonjs' }] | ||||
|       ], | ||||
|       plugins: ['istanbul'] | ||||
|     } | ||||
|   } | ||||
|     '@vue/app' | ||||
|   ] | ||||
| } | ||||
|   | ||||
							
								
								
									
										24
									
								
								jest.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								jest.config.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| module.exports = { | ||||
|   verbose: true, | ||||
|   moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], | ||||
|   transform: { | ||||
|     '^.+\\.vue$': 'vue-jest', | ||||
|     '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub', | ||||
|     '^.+\\.jsx?$': 'babel-jest' | ||||
|   }, | ||||
|   moduleNameMapper: { | ||||
|     '^@/(.*)$': '<rootDir>/src/$1' | ||||
|   }, | ||||
|   snapshotSerializers: ['jest-serializer-vue'], | ||||
|   testMatch: [ | ||||
|     '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' | ||||
|   ], | ||||
|   collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'], | ||||
|   coverageDirectory: '<rootDir>/tests/unit/coverage', | ||||
|   // 'collectCoverage': true, | ||||
|   'coverageReporters': [ | ||||
|     'lcov', | ||||
|     'text-summary' | ||||
|   ], | ||||
|   testURL: 'http://localhost/' | ||||
| } | ||||
| @@ -10,6 +10,7 @@ | ||||
|     "build:sit": "vue-cli-service build --mode text", | ||||
|     "lint": "eslint --ext .js,.vue src", | ||||
|     "test": "npm run lint", | ||||
|     "test:unit": "vue-cli-service test:unit", | ||||
|     "precommit": "lint-staged", | ||||
|     "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml" | ||||
|   }, | ||||
|   | ||||
| @@ -33,10 +33,11 @@ export default { | ||||
|     isActive: { | ||||
|       type: Boolean, | ||||
|       default: false | ||||
|     }, | ||||
|     toggleClick: { | ||||
|       type: Function, | ||||
|       default: null | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     toggleClick() { | ||||
|       this.$emit('toggleClick') | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -36,7 +36,11 @@ export function parseTime(time, cFormat) { | ||||
| } | ||||
|  | ||||
| export function formatTime(time, option) { | ||||
|   time = +time * 1000 | ||||
|   if (('' + time).length === 10) { | ||||
|     time = parseInt(time) * 1000 | ||||
|   } else { | ||||
|     time = +time | ||||
|   } | ||||
|   const d = new Date(time) | ||||
|   const now = Date.now() | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * Created by jiachenpan on 16/11/18. | ||||
|  */ | ||||
|  | ||||
| export function isvalidUsername(str) { | ||||
| export function validUsername(str) { | ||||
|   const valid_map = ['admin', 'editor'] | ||||
|   return valid_map.indexOf(str.trim()) >= 0 | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <template> | ||||
|   <div class="navbar"> | ||||
|     <hamburger :toggle-click="toggleSideBar" :is-active="sidebar.opened" class="hamburger-container"/> | ||||
|     <hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar"/> | ||||
|  | ||||
|     <breadcrumb class="breadcrumb-container"/> | ||||
|  | ||||
|   | ||||
| @@ -63,7 +63,7 @@ | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { isvalidUsername } from '@/utils/validate' | ||||
| import { validUsername } from '@/utils/validate' | ||||
| import LangSelect from '@/components/LangSelect' | ||||
| import SocialSign from './socialsignin' | ||||
|  | ||||
| @@ -72,7 +72,7 @@ export default { | ||||
|   components: { LangSelect, SocialSign }, | ||||
|   data() { | ||||
|     const validateUsername = (rule, value, callback) => { | ||||
|       if (!isvalidUsername(value)) { | ||||
|       if (!validUsername(value)) { | ||||
|         callback(new Error('Please enter the correct user name')) | ||||
|       } else { | ||||
|         callback() | ||||
|   | ||||
							
								
								
									
										5
									
								
								tests/unit/.eslintrc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								tests/unit/.eslintrc.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| module.exports = { | ||||
|   env: { | ||||
|     jest: true | ||||
|   } | ||||
| } | ||||
							
								
								
									
										18
									
								
								tests/unit/components/Hamburger.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								tests/unit/components/Hamburger.spec.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| import { shallowMount } from '@vue/test-utils' | ||||
| import Hamburger from '@/components/Hamburger/index.vue' | ||||
| describe('Hamburger.vue', () => { | ||||
|   it('toggle click', () => { | ||||
|     const wrapper = shallowMount(Hamburger) | ||||
|     const mockFn = jest.fn() | ||||
|     wrapper.vm.$on('toggleClick', mockFn) | ||||
|     wrapper.find('.hamburger').trigger('click') | ||||
|     expect(mockFn).toBeCalled() | ||||
|   }) | ||||
|   it('prop isActive', () => { | ||||
|     const wrapper = shallowMount(Hamburger) | ||||
|     wrapper.setProps({ isActive: true }) | ||||
|     expect(wrapper.contains('.is-active')).toBe(true) | ||||
|     wrapper.setProps({ isActive: false }) | ||||
|     expect(wrapper.contains('.is-active')).toBe(false) | ||||
|   }) | ||||
| }) | ||||
							
								
								
									
										22
									
								
								tests/unit/components/SvgIcon.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								tests/unit/components/SvgIcon.spec.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| import { shallowMount } from '@vue/test-utils' | ||||
| import SvgIcon from '@/components/SvgIcon/index.vue' | ||||
| describe('SvgIcon.vue', () => { | ||||
|   it('iconClass', () => { | ||||
|     const wrapper = shallowMount(SvgIcon, { | ||||
|       propsData: { | ||||
|         iconClass: 'test' | ||||
|       } | ||||
|     }) | ||||
|     expect(wrapper.find('use').attributes().href).toBe('#icon-test') | ||||
|   }) | ||||
|   it('className', () => { | ||||
|     const wrapper = shallowMount(SvgIcon, { | ||||
|       propsData: { | ||||
|         iconClass: 'test' | ||||
|       } | ||||
|     }) | ||||
|     expect(wrapper.classes().length).toBe(1) | ||||
|     wrapper.setProps({ className: 'test' }) | ||||
|     expect(wrapper.classes().includes('test')).toBe(true) | ||||
|   }) | ||||
| }) | ||||
							
								
								
									
										29
									
								
								tests/unit/utils/formatTime.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								tests/unit/utils/formatTime.spec.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| import { formatTime } from '@/utils/index.js' | ||||
| describe('Utils:formatTime', () => { | ||||
|   const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01" | ||||
|   const retrofit = 5 * 1000 | ||||
|  | ||||
|   it('ten digits timestamp', () => { | ||||
|     expect(formatTime((d / 1000).toFixed(0))).toBe('7月13日17时54分') | ||||
|   }) | ||||
|   it('test now', () => { | ||||
|     expect(formatTime(+new Date() - 1)).toBe('刚刚') | ||||
|   }) | ||||
|   it('less two minute', () => { | ||||
|     expect(formatTime(+new Date() - 60 * 2 * 1000 + retrofit)).toBe('2分钟前') | ||||
|   }) | ||||
|   it('less two hour', () => { | ||||
|     expect(formatTime(+new Date() - 60 * 60 * 2 * 1000 + retrofit)).toBe('2小时前') | ||||
|   }) | ||||
|   it('less one day', () => { | ||||
|     expect(formatTime(+new Date() - 60 * 60 * 24 * 1 * 1000)).toBe('1天前') | ||||
|   }) | ||||
|   it('more than one day', () => { | ||||
|     expect(formatTime(d)).toBe('7月13日17时54分') | ||||
|   }) | ||||
|   it('format', () => { | ||||
|     expect(formatTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54') | ||||
|     expect(formatTime(d, '{y}-{m}-{d}')).toBe('2018-07-13') | ||||
|     expect(formatTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54') | ||||
|   }) | ||||
| }) | ||||
							
								
								
									
										27
									
								
								tests/unit/utils/parseTime.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								tests/unit/utils/parseTime.spec.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| import { parseTime } from '@/utils/index.js' | ||||
| describe('Utils:parseTime', () => { | ||||
|   const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01" | ||||
|   it('timestamp', () => { | ||||
|     expect(parseTime(d)).toBe('2018-07-13 17:54:01') | ||||
|   }) | ||||
|   it('ten digits timestamp', () => { | ||||
|     expect(parseTime((d / 1000).toFixed(0))).toBe('2018-07-13 17:54:01') | ||||
|   }) | ||||
|   it('new Date', () => { | ||||
|     expect(parseTime(new Date(d))).toBe('2018-07-13 17:54:01') | ||||
|   }) | ||||
|   it('format', () => { | ||||
|     expect(parseTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54') | ||||
|     expect(parseTime(d, '{y}-{m}-{d}')).toBe('2018-07-13') | ||||
|     expect(parseTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54') | ||||
|   }) | ||||
|   it('get the day of the week', () => { | ||||
|     expect(parseTime(d, '{a}')).toBe('五') // 星期五 | ||||
|   }) | ||||
|   it('get the day of the week', () => { | ||||
|     expect(parseTime(+d + 1000 * 60 * 60 * 24 * 2, '{a}')).toBe('日') // 星期日 | ||||
|   }) | ||||
|   it('empty argument', () => { | ||||
|     expect(parseTime()).toBeNull() | ||||
|   }) | ||||
| }) | ||||
							
								
								
									
										28
									
								
								tests/unit/utils/validate.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								tests/unit/utils/validate.spec.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| import { validUsername, validateURL, validateLowerCase, validateUpperCase, validateAlphabets } from '@/utils/validate.js' | ||||
| describe('Utils:validate', () => { | ||||
|   it('validUsername', () => { | ||||
|     expect(validUsername('admin')).toBe(true) | ||||
|     expect(validUsername('editor')).toBe(true) | ||||
|     expect(validUsername('xxxx')).toBe(false) | ||||
|   }) | ||||
|   it('validateURL', () => { | ||||
|     expect(validateURL('https://github.com/PanJiaChen/vue-element-admin')).toBe(true) | ||||
|     expect(validateURL('http://github.com/PanJiaChen/vue-element-admin')).toBe(true) | ||||
|     expect(validateURL('github.com/PanJiaChen/vue-element-admin')).toBe(false) | ||||
|   }) | ||||
|   it('validateLowerCase', () => { | ||||
|     expect(validateLowerCase('abc')).toBe(true) | ||||
|     expect(validateLowerCase('Abc')).toBe(false) | ||||
|     expect(validateLowerCase('123abc')).toBe(false) | ||||
|   }) | ||||
|   it('validateUpperCase', () => { | ||||
|     expect(validateUpperCase('ABC')).toBe(true) | ||||
|     expect(validateUpperCase('Abc')).toBe(false) | ||||
|     expect(validateUpperCase('123ABC')).toBe(false) | ||||
|   }) | ||||
|   it('validateAlphabets', () => { | ||||
|     expect(validateAlphabets('ABC')).toBe(true) | ||||
|     expect(validateAlphabets('Abc')).toBe(true) | ||||
|     expect(validateAlphabets('123aBC')).toBe(false) | ||||
|   }) | ||||
| }) | ||||
		Reference in New Issue
	
	Block a user