DEV;Fix tests, lint and build

This commit is contained in:
romanjaros 2021-08-03 08:00:06 +02:00
parent 8a8cf962d8
commit 40deb32d91
17 changed files with 81 additions and 110 deletions

View file

@ -26,6 +26,7 @@ module.exports.append = (config) => {
config.resolve.extensions.push('.ts', '.tsx', '.mdx', '.json', 'txt'); config.resolve.extensions.push('.ts', '.tsx', '.mdx', '.json', 'txt');
config.resolve.alias = { config.resolve.alias = {
...config.resolve.alias, ...config.resolve.alias,
config: path.join(__dirname, '../../config'),
'@treejs/components': path.join(__dirname, '../../packages/components/src'), '@treejs/components': path.join(__dirname, '../../packages/components/src'),
'@treejs/api': path.join(__dirname, '../../packages/api/src'), '@treejs/api': path.join(__dirname, '../../packages/api/src'),
'@treejs/auth': path.join(__dirname, '../../packages/auth/src'), '@treejs/auth': path.join(__dirname, '../../packages/auth/src'),

8
Jenkinsfile vendored
View file

@ -7,13 +7,7 @@ setup {
} }
node { node {
checkCodeStability({ checkCodeStability({})
postInstallClosure = { isOnlyDeploy ->
stageWhen('typedoc', !isOnlyDeploy, {
sh 'npm run build:doc'
})
}
})
release({ release({
publishToNPM({ publishToNPM({

View file

@ -1,37 +0,0 @@
interface AppConfig {
BASE_ENDPOINT_URL: string;
CLIENT_PORT?: number;
SELENIUM_IP: string;
SELENIUM_PORT: number;
SERVER_IP: string;
}
let config: AppConfig = {
SELENIUM_IP: '192.168.0.40',
SELENIUM_PORT: 4444,
SERVER_IP: 'localhost',
CLIENT_PORT: 80,
BASE_ENDPOINT_URL: 'https://jsonplaceholder.typicode.com',
};
// API and E2E types
if (process.env.APP_ENV === 'CI') {
config = {
...config,
SERVER_IP: '192.168.0.40',
CLIENT_PORT: 89,
};
}
// start server with this setting
if (process.env.APP_ENV === 'test') {
config = {
...config,
SERVER_IP: '0.0.0.0',
CLIENT_PORT: 89,
};
}
export default config;

6
config/config.json Normal file
View file

@ -0,0 +1,6 @@
{
"E2E_PORT": 9091,
"LOCALHOST_PORT": 6006,
"BASE_ENDPOINT_URL": "https://jsonplaceholder.typicode.com"
}

View file

@ -8,16 +8,17 @@ module.exports = {
testRegex: '(/__tests__/.*|(-|/)(test))\\.tsx?$', testRegex: '(/__tests__/.*|(-|/)(test))\\.tsx?$',
moduleFileExtensions: ['ts', 'tsx', 'js', 'json'], moduleFileExtensions: ['ts', 'tsx', 'js', 'json'],
moduleNameMapper: { moduleNameMapper: {
'^@treejs/components(.*)$': '<rootDir>/packages/treejs-components/src/$1', '^config(.*)$': '<rootDir>/config/$1',
'^@treejs/api(.*)$': '<rootDir>/packages/treejs-api/src/$1', '^@treejs/components(.*)$': '<rootDir>/packages/components/src/$1',
'^@treejs/auth(.*)$': '<rootDir>/packages/treejs-auth/src/$1', '^@treejs/api(.*)$': '<rootDir>/packages/api/src/$1',
'^@treejs/constants(.*)$': '<rootDir>/packages/treejs-constants/src/$1', '^@treejs/auth(.*)$': '<rootDir>/packages/auth/src/$1',
'^@treejs/utils(.*)$': '<rootDir>/packages/treejs-utils/src/$1', '^@treejs/constants(.*)$': '<rootDir>/packages/constants/src/$1',
'^@treejs/forms(.*)$': '<rootDir>/packages/treejs-forms/src/$1', '^@treejs/utils(.*)$': '<rootDir>/packages/utils/src/$1',
'^@treejs/hooks(.*)$': '<rootDir>/packages/treejs-forms/src/$1', '^@treejs/forms(.*)$': '<rootDir>/packages/forms/src/$1',
'^@treejs/localization(.*)$': '<rootDir>/packages/treejs-localization/src/$1', '^@treejs/hooks(.*)$': '<rootDir>/packages/forms/src/$1',
'^@treejs/styles(.*)$': '<rootDir>/packages/treejs-styles/src/$1', '^@treejs/localization(.*)$': '<rootDir>/packages/localization/src/$1',
'^@treejs/types(.*)$': '<rootDir>/packages/treejs-types/src/$1', '^@treejs/styles(.*)$': '<rootDir>/packages/styles/src/$1',
'^@treejs/types(.*)$': '<rootDir>/packages/types/src/$1',
'\\.(css|less|sass|scss)$': '<rootDir>/types/emptyMock.ts', '\\.(css|less|sass|scss)$': '<rootDir>/types/emptyMock.ts',
}, },
collectCoverage: !!process.env.CI, collectCoverage: !!process.env.CI,
@ -26,7 +27,6 @@ module.exports = {
// enzyme // enzyme
snapshotSerializers: ['enzyme-to-json/serializer'], snapshotSerializers: ['enzyme-to-json/serializer'],
setupFilesAfterEnv: ['./config/jestSetup.ts'],
globals: { globals: {
'ts-jest': { 'ts-jest': {

View file

@ -6,9 +6,9 @@ RUN apk add nginx --force
RUN mkdir app RUN mkdir app
RUN mkdir -p /run/nginx RUN mkdir -p /run/nginx
COPY ./dist /app/dist COPY ./storybook-static /app/dist
COPY ./docker/nginx/conf.d/ /etc/nginx/conf.d/ COPY ./docker/nginx/conf.d/ /etc/nginx/conf.d/
EXPOSE 80 3330 EXPOSE 80
VOLUME [ "/etc/nginx/conf.d" ] VOLUME [ "/etc/nginx/conf.d" ]

View file

@ -4,10 +4,6 @@ server {
server_name _; server_name _;
root /app/dist/client; root /app/dist;
index index.html; index index.html;
location / {
try_files $uri $uri/ /index.html;
}
} }

View file

@ -1,11 +1,5 @@
var config = require('../e2e_app_config.json');
module.exports = { module.exports = {
'Welcome page': function (browser) { 'Welcome page': function (browser) {
browser browser.url(browser.launchUrl).waitForElementVisible('body', 1000).assert.title('Storybook').end();
.url('http://' + config.IP + ':' + config.PORT)
.waitForElementVisible('body', 1000)
.assert.title('Storybook')
.end();
}, },
}; };

View file

@ -1,4 +0,0 @@
{
"IP": "192.168.0.20",
"PORT": 9080
}

33
nightwatch.conf.js Normal file
View file

@ -0,0 +1,33 @@
const config = require('./config/config.json');
const setting = {
selenium_port: 4444,
selenium_host: '192.168.0.20',
desiredCapabilities: {
chromeOptions: {
args: ['headless', 'no-sandbox'],
},
},
};
module.exports = {
src_folders: 'e2e/',
output_folder: false,
selenium: {
start_process: false,
},
test_settings: {
localhost: Object.assign(
{
launch_url: 'http://192.168.0.120:' + config.LOCALHOST_PORT,
},
setting
),
ci: Object.assign(
{
launch_url: 'http://192.168.0.20:' + config.E2E_PORT,
},
setting
),
},
};

View file

@ -1,21 +0,0 @@
{
"src_folders": "e2e/",
"output_folder": false,
"selenium": {
"start_process": false
},
"test_settings": {
"default": {
"selenium_port": 4444,
"selenium_host": "192.168.0.20",
"desiredCapabilities": {
"chromeOptions": {
"args": [
"headless",
"no-sandbox"
]
}
}
}
}
}

View file

@ -8,20 +8,19 @@
"scripts": { "scripts": {
"postinstall": "lerna bootstrap", "postinstall": "lerna bootstrap",
"storybook": "start-storybook -p 6006 -c .storybook --ci", "storybook": "start-storybook -p 6006 -c .storybook --ci",
"storybook:build": "build-storybook",
"storybook:serve": "http-server storybook-static", "storybook:serve": "http-server storybook-static",
"test": "jest -c config/jest.config.js", "test": "jest -c config/jest.config.js",
"test:update": "npm run test -- -u", "test:update": "npm run test -- -u",
"test-e2e": "nightwatch --env localhost",
"eslint": "eslint -c .eslintrc packages/**/*.{ts,tsx}", "eslint": "eslint -c .eslintrc packages/**/*.{ts,tsx}",
"prettier": "prettier --check packages/**/*.ts", "prettier": "prettier --check packages/**/*.ts",
"prettier:fix": "prettier --check --write packages/**/*.ts", "prettier:fix": "prettier --check --write packages/**/*.ts",
"lint": "npm run eslint && npm run prettier", "lint": "npm run eslint && npm run prettier",
"build:module": "lerna run build", "build:module": "lerna run build",
"clean:module": "lerna run clean", "clean:module": "lerna run clean",
"serve": "http-server dist/client",
"ci:lint": "cross-env CI=true npm run lint", "ci:lint": "cross-env CI=true npm run lint",
"ci:test": "cross-env CI=true npm run test", "ci:test": "cross-env CI=true npm run test",
"ci:test-e2e": "nightwatch", "ci:test-e2e": "nightwatch --env ci",
"ci:build": "build-storybook", "ci:build": "build-storybook",
"ci:increase-version": "lerna version --no-git-tag-version --no-push --yes" "ci:increase-version": "lerna version --no-git-tag-version --no-push --yes"
}, },

View file

@ -1,5 +1,4 @@
import React, { useCallback, useEffect, useMemo, useState } from 'react'; import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { is } from 'ramda';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import cx from 'classnames'; import cx from 'classnames';

View file

@ -4,7 +4,6 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import cx from 'classnames'; import cx from 'classnames';
import { History } from 'history'; import { History } from 'history';
import Button from '@treejs/components/Button';
import { isNilOrEmpty } from '@treejs/utils'; import { isNilOrEmpty } from '@treejs/utils';
import Modals from '../../Modal/components/Modals'; import Modals from '../../Modal/components/Modals';

View file

@ -1,25 +1,35 @@
import { initLocalization } from '@treejs/localization/init';
import { getPluralMessage } from '../message'; import { getPluralMessage } from '../message';
describe('Localization message', () => { describe('Localization message', () => {
initLocalization('cs', {
cs: {
char: 'znak',
char_2: 'znaky',
char_5: 'znaku',
},
});
describe('getPluralMessage', () => { describe('getPluralMessage', () => {
it('should return char_5 for 0 count', () => { it('should return char_5 for 0 count', () => {
expect(getPluralMessage(0)('common:char')).toBe('common:char_5'); expect(getPluralMessage(0)('char')).toBe('znaku');
}); });
it('should return char for 1 count', () => { it('should return char for 1 count', () => {
expect(getPluralMessage(1)('common:char')).toBe('common:char'); expect(getPluralMessage(1)('char')).toBe('znak');
expect(getPluralMessage(-1)('common:char')).toBe('common:char'); expect(getPluralMessage(-1)('char')).toBe('znak');
}); });
it('should return char_2 for 2 count', () => { it('should return char_2 for 2 count', () => {
expect(getPluralMessage(2)('common:char')).toBe('common:char_2'); expect(getPluralMessage(2)('char')).toBe('znaky');
expect(getPluralMessage(-2)('common:char')).toBe('common:char_2'); expect(getPluralMessage(-2)('char')).toBe('znaky');
}); });
it('should return char_5 for 5 count', () => { it('should return char_5 for 5 count', () => {
expect(getPluralMessage(5)('common:char')).toBe('common:char_5'); expect(getPluralMessage(5)('char')).toBe('znaku');
expect(getPluralMessage(-5)('common:char')).toBe('common:char_5'); expect(getPluralMessage(-5)('char')).toBe('znaku');
}); });
it('should return char_5 for 10 count', () => { it('should return char_5 for 10 count', () => {
expect(getPluralMessage(10)('common:char')).toBe('common:char_5'); expect(getPluralMessage(10)('char')).toBe('znaku');
expect(getPluralMessage(-10)('common:char')).toBe('common:char_5'); expect(getPluralMessage(-10)('char')).toBe('znaku');
}); });
}); });
}); });

View file

@ -1,6 +1,7 @@
import React from 'react'; import React from 'react';
import { combineReducers, configureStore, getDefaultMiddleware } from '@reduxjs/toolkit'; import { combineReducers, configureStore, getDefaultMiddleware } from '@reduxjs/toolkit';
import config from 'config/config.json';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import { API_REDUCER_NAME } from '@treejs/api/constants'; import { API_REDUCER_NAME } from '@treejs/api/constants';
@ -17,7 +18,7 @@ const store = configureStore({
middleware: [ middleware: [
...getDefaultMiddleware({ thunk: true }).concat( ...getDefaultMiddleware({ thunk: true }).concat(
apiMiddleware({ apiMiddleware({
BASE_ENDPOINT_URL: 'https://jsonplaceholder.typicode.com', BASE_ENDPOINT_URL: config.BASE_ENDPOINT_URL,
}) })
), ),
], ],

View file

@ -15,6 +15,7 @@
"jsx": "react", "jsx": "react",
"baseUrl": "./", "baseUrl": "./",
"paths": { "paths": {
"config/*": ["./config/*"],
"@treejs/components/*": ["./packages/components/src/*"], "@treejs/components/*": ["./packages/components/src/*"],
"@treejs/api/*": ["./packages/api/src/*"], "@treejs/api/*": ["./packages/api/src/*"],
"@treejs/auth/*": ["./packages/auth/src/*"], "@treejs/auth/*": ["./packages/auth/src/*"],