Skip to content

Commit

Permalink
Configure unit test environment; add build & test CI (#104)
Browse files Browse the repository at this point in the history
Signed-off-by: Tyler Ohlsen <[email protected]>
(cherry picked from commit 1690766)
  • Loading branch information
ohltyler authored and github-actions[bot] committed Mar 4, 2024
1 parent 9b7024b commit 94029b7
Show file tree
Hide file tree
Showing 11 changed files with 246 additions and 3 deletions.
101 changes: 101 additions & 0 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
name: Build & test
on:
push:
branches:
- "*"
pull_request:
branches:
- "*"
env:
OPENSEARCH_DASHBOARDS_VERSION: 'main'

jobs:
Get-CI-Image-Tag:
uses: opensearch-project/opensearch-build/.github/workflows/get-ci-image-tag.yml@main
with:
product: opensearch-dashboards

build-and-test-linux:
needs: Get-CI-Image-Tag
name: Build & test
strategy:
matrix:
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
container:
image: ${{ needs.Get-CI-Image-Tag.outputs.ci-image-version-linux }}
options: --user root

steps:
- name: Checkout OpenSearch Dashboards
uses: actions/checkout@v2
with:
repository: opensearch-project/OpenSearch-Dashboards
ref: ${{ env.OPENSEARCH_DASHBOARDS_VERSION }}
path: OpenSearch-Dashboards
- name: Checkout plugin
uses: actions/checkout@v2
with:
path: OpenSearch-Dashboards/plugins/dashboards-flow-framework
- name: Bootstrap / build / unit test the plugin
run: |
chown -R 1000:1000 `pwd`
cd ./OpenSearch-Dashboards/
su `id -un 1000` -c "source $NVM_DIR/nvm.sh && nvm use && node -v && yarn -v &&
cd ./plugins/dashboards-flow-framework &&
whoami && yarn osd bootstrap && yarn build && yarn run test:jest --coverage"
- name: Uploads coverage
uses: codecov/codecov-action@v1

# TODO: once github actions supports windows and macos docker containers, we can
# merge these in to the above step's matrix, including adding windows support
build-and-test-windows-macos:
name: Build & test
strategy:
matrix:
os: [macos-latest]
runs-on: ${{ matrix.os }}
steps:
# Enable longer filenames for windows
- name: Enable longer filenames
if: ${{ matrix.os == 'windows-latest' }}
run: git config --system core.longpaths true
- name: Checkout OpenSearch Dashboards
uses: actions/checkout@v2
with:
repository: opensearch-project/OpenSearch-Dashboards
ref: ${{ env.OPENSEARCH_DASHBOARDS_VERSION }}
path: OpenSearch-Dashboards
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version-file: './OpenSearch-Dashboards/.nvmrc'
registry-url: 'https://registry.npmjs.org'
- name: Install Yarn
# Need to use bash to avoid having a windows/linux specific step
shell: bash
run: |
YARN_VERSION=$(node -p "require('./OpenSearch-Dashboards/package.json').engines.yarn")
echo "Installing yarn@$YARN_VERSION"
npm i -g yarn@$YARN_VERSION
- run: node -v
- run: yarn -v
- name: Checkout plugin
uses: actions/checkout@v2
with:
path: OpenSearch-Dashboards/plugins/dashboards-flow-framework
- name: Bootstrap the plugin
run: |
cd OpenSearch-Dashboards/plugins/dashboards-flow-framework
yarn osd bootstrap
- name: Build the plugin
run: |
cd OpenSearch-Dashboards/plugins/dashboards-flow-framework
yarn build
- name: Run unit tests
run: |
cd OpenSearch-Dashboards/plugins/dashboards-flow-framework
yarn run test:jest --coverage
- name: Uploads coverage
uses: codecov/codecov-action@v1

16 changes: 16 additions & 0 deletions babel.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

module.exports = {
presets: [
require('@babel/preset-env'),
require('@babel/preset-react'),
require('@babel/preset-typescript'),
],
plugins: [
['@babel/plugin-transform-modules-commonjs', { allowTopLevelThis: true }],
[require('@babel/plugin-transform-runtime'), { regenerator: true }],
],
};
4 changes: 1 addition & 3 deletions opensearch_dashboards.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
"opensearchDashboardsVersion": "2.13.0",
"server": true,
"ui": true,
"requiredBundles": [
"opensearchDashboardsUtils"
],
"requiredBundles": [],
"requiredPlugins": [
"navigation"
],
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
"opensearch": "../../scripts/use_node ../../scripts/opensearch",
"lint:es": "../../scripts/use_node ../../scripts/eslint -c eslintrc.json",
"lint:es:precommit": "yarn lint:es common/* public/* server/*",
"test:jest": "../../node_modules/.bin/jest --config ./test/jest.config.js",
"build": "yarn plugin-helpers build && echo Renaming artifact to $npm_package_config_plugin_zip_name-$npm_package_config_plugin_version.zip && mv ./build/$npm_package_config_plugin_name*.zip ./build/$npm_package_config_plugin_zip_name-$npm_package_config_plugin_version.zip"
},
"repository": {
Expand Down
46 changes: 46 additions & 0 deletions public/pages/workflows/workflows.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

import React from 'react';
import { render } from '@testing-library/react';
import { Provider } from 'react-redux';

import {
BrowserRouter as Router,
RouteComponentProps,
Route,
Switch,
} from 'react-router-dom';
import { store } from '../../store';
import { Workflows } from './workflows';

jest.mock('../../services', () => {
const { mockCoreServices } = require('../../../test');

Check failure on line 20 in public/pages/workflows/workflows.test.tsx

View workflow job for this annotation

GitHub Actions / Run lint script

Require statement not part of import statement

Check failure on line 20 in public/pages/workflows/workflows.test.tsx

View workflow job for this annotation

GitHub Actions / Run lint script

Require statement not part of import statement
return {
...jest.requireActual('../../services'),
...mockCoreServices,
};
});

const renderWithRouter = () => ({
...render(
<Provider store={store}>
<Router>
<Switch>
<Route
render={(props: RouteComponentProps) => <Workflows {...props} />}
/>
</Switch>
</Router>
</Provider>
),
});

describe('Workflows', () => {
test('renders the page', () => {
const { getByText } = renderWithRouter();
expect(getByText('Workflows')).not.toBeNull();
});
});
6 changes: 6 additions & 0 deletions test/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

export * from './mocks';
40 changes: 40 additions & 0 deletions test/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

module.exports = {
rootDir: '../',
roots: ['<rootDir>'],
coverageDirectory: './coverage',
// we mock any style-related files and return an empty module. This is needed due to errors
// when jest tries to interpret these types of files.
moduleNameMapper: {
'\\.(css|less|scss|sass)$': '<rootDir>/test/mocks/style_mock.ts',
},
testEnvironment: 'jest-environment-jsdom',
coverageReporters: ['lcov', 'text', 'cobertura'],
testMatch: ['**/*.test.js', '**/*.test.jsx', '**/*.test.ts', '**/*.test.tsx'],
collectCoverageFrom: [
'**/*.ts',
'**/*.tsx',
'**/*.js',
'**/*.jsx',
'!**/models/**',
'!**/node_modules/**',
'!**/index.js',
'!<rootDir>/public/app.js',
'!<rootDir>/index.js',
'!<rootDir>/babel.config.js',
'!<rootDir>/test/**',
'!<rootDir>/server/**',
'!<rootDir>/coverage/**',
'!<rootDir>/scripts/**',
'!<rootDir>/build/**',
'!**/vendor/**',
],
clearMocks: true,
modulePathIgnorePatterns: ['<rootDir>/offline-module-cache/'],
testPathIgnorePatterns: ['<rootDir>/build/', '<rootDir>/node_modules/'],
transformIgnorePatterns: ['<rootDir>/node_modules'],
};
6 changes: 6 additions & 0 deletions test/mocks/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

export { mockCoreServices } from './mock_core_services';
22 changes: 22 additions & 0 deletions test/mocks/mock_core_services.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

export const mockCoreServices = {
getCore: () => {
return {
chrome: {
setBreadcrumbs: jest.fn(),
},
};
},
getNotifications: () => {
return {
toasts: {
addDanger: jest.fn().mockName('addDanger'),
addSuccess: jest.fn().mockName('addSuccess'),
},
};
},
};
6 changes: 6 additions & 0 deletions test/mocks/style_mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

export default {};
1 change: 1 addition & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
"public/**/*.ts",
"public/**/*.tsx",
"server/**/*.ts",
"test/**/*",
"../../typings/**/*"
],
"exclude": ["node_modules", "*/node_modules/"]
Expand Down

0 comments on commit 94029b7

Please sign in to comment.