diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index 0254508a..9a26a093 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -44,13 +44,14 @@ jobs:
- uses: ./tools/github-actions/setup-deps
- name: Unit Test
run: |
- make test
+ make test build-ui test-ui
- name: Report
if: github.actor == 'linuxsuren'
env:
CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}
run: |
bash <(curl -Ls https://coverage.codacy.com/get.sh) report --partial --force-coverage-parser go -r coverage.out
+ bash <(curl -Ls https://coverage.codacy.com/get.sh) report --partial console/atest-ui/coverage/clover.xml
bash <(curl -Ls https://coverage.codacy.com/get.sh) final
image:
diff --git a/README.md b/README.md
index ffd3073f..23aa5468 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
> English | [δΈζ](README-ZH.md)
-This is a API testing tool. π
+This is an awesome API testing tool. π
## Features
diff --git a/console/atest-ui/package-lock.json b/console/atest-ui/package-lock.json
index 43b67551..a35aea4b 100644
--- a/console/atest-ui/package-lock.json
+++ b/console/atest-ui/package-lock.json
@@ -43,6 +43,7 @@
"eslint-plugin-vue": "^9.11.0",
"fetch-mock-jest": "^1.5.1",
"jest": "^29.6.1",
+ "jest-fetch-mock": "^3.0.3",
"jsdom": "^22.1.0",
"npm-run-all": "^4.1.5",
"prettier": "^2.8.8",
@@ -4270,6 +4271,15 @@
"resolved": "https://registry.npmmirror.com/crelt/-/crelt-1.0.6.tgz",
"integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g=="
},
+ "node_modules/cross-fetch": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz",
+ "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==",
+ "dev": true,
+ "dependencies": {
+ "node-fetch": "^2.6.12"
+ }
+ },
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -7492,6 +7502,16 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
+ "node_modules/jest-fetch-mock": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz",
+ "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==",
+ "dev": true,
+ "dependencies": {
+ "cross-fetch": "^3.0.4",
+ "promise-polyfill": "^8.1.3"
+ }
+ },
"node_modules/jest-get-type": {
"version": "29.4.3",
"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
@@ -9299,8 +9319,6 @@
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz",
"integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
"whatwg-url": "^5.0.0"
},
@@ -9320,25 +9338,19 @@
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
- "dev": true,
- "optional": true,
- "peer": true
+ "dev": true
},
"node_modules/node-fetch/node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "dev": true,
- "optional": true,
- "peer": true
+ "dev": true
},
"node_modules/node-fetch/node_modules/whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"dev": true,
- "optional": true,
- "peer": true,
"dependencies": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
@@ -10025,6 +10037,12 @@
"asap": "~2.0.6"
}
},
+ "node_modules/promise-polyfill": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.3.0.tgz",
+ "integrity": "sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==",
+ "dev": true
+ },
"node_modules/prompts": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
@@ -15368,6 +15386,15 @@
"resolved": "https://registry.npmmirror.com/crelt/-/crelt-1.0.6.tgz",
"integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g=="
},
+ "cross-fetch": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz",
+ "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==",
+ "dev": true,
+ "requires": {
+ "node-fetch": "^2.6.12"
+ }
+ },
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -17864,6 +17891,16 @@
"jest-util": "^29.6.1"
}
},
+ "jest-fetch-mock": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz",
+ "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==",
+ "dev": true,
+ "requires": {
+ "cross-fetch": "^3.0.4",
+ "promise-polyfill": "^8.1.3"
+ }
+ },
"jest-get-type": {
"version": "29.4.3",
"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
@@ -19264,8 +19301,6 @@
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz",
"integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==",
"dev": true,
- "optional": true,
- "peer": true,
"requires": {
"whatwg-url": "^5.0.0"
},
@@ -19274,25 +19309,19 @@
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
- "dev": true,
- "optional": true,
- "peer": true
+ "dev": true
},
"webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "dev": true,
- "optional": true,
- "peer": true
+ "dev": true
},
"whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"dev": true,
- "optional": true,
- "peer": true,
"requires": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
@@ -19823,6 +19852,12 @@
"asap": "~2.0.6"
}
},
+ "promise-polyfill": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.3.0.tgz",
+ "integrity": "sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==",
+ "dev": true
+ },
"prompts": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
diff --git a/console/atest-ui/package.json b/console/atest-ui/package.json
index 8e34fdfc..7b1e7da9 100644
--- a/console/atest-ui/package.json
+++ b/console/atest-ui/package.json
@@ -51,6 +51,7 @@
"eslint-plugin-vue": "^9.11.0",
"fetch-mock-jest": "^1.5.1",
"jest": "^29.6.1",
+ "jest-fetch-mock": "^3.0.3",
"jsdom": "^22.1.0",
"npm-run-all": "^4.1.5",
"prettier": "^2.8.8",
diff --git a/console/atest-ui/src/components/LoginDialog.vue b/console/atest-ui/src/components/LoginDialog.vue
new file mode 100644
index 00000000..357666dc
--- /dev/null
+++ b/console/atest-ui/src/components/LoginDialog.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Open
this link, and type the code:
{{ deviceAuthResponse.user_code }}. Then click the next step button.
+
+ Next step
+
+
+
+
diff --git a/console/atest-ui/src/components/TestSuiteCreationDialog.vue b/console/atest-ui/src/components/TestSuiteCreationDialog.vue
new file mode 100644
index 00000000..ff4e4c18
--- /dev/null
+++ b/console/atest-ui/src/components/TestSuiteCreationDialog.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
diff --git a/console/atest-ui/src/components/TestSuiteImportDialog.vue b/console/atest-ui/src/components/TestSuiteImportDialog.vue
new file mode 100644
index 00000000..ddb0f1d5
--- /dev/null
+++ b/console/atest-ui/src/components/TestSuiteImportDialog.vue
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('button.import') }}
+
+
+
+
diff --git a/console/atest-ui/src/locales/en.json b/console/atest-ui/src/locales/en.json
index 6a4a60b0..1d7e487c 100644
--- a/console/atest-ui/src/locales/en.json
+++ b/console/atest-ui/src/locales/en.json
@@ -68,7 +68,7 @@
"disabled": "Disabled",
"status": "Status",
"operations": "Operations",
- "storageLocation": "Storage Location",
+ "storageLocation": "Location",
"suiteKind": "Suite Kind",
"key": "Key",
"value": "Value"
diff --git a/console/atest-ui/src/views/TestingHistoryPanel.vue b/console/atest-ui/src/views/TestingHistoryPanel.vue
index 6b5374bc..e1eaba09 100644
--- a/console/atest-ui/src/views/TestingHistoryPanel.vue
+++ b/console/atest-ui/src/views/TestingHistoryPanel.vue
@@ -232,29 +232,6 @@ const filterTestCases = (value: string, data: Tree) => {
}
const viewName = ref('')
-
-const deviceAuthActive = ref(0)
-const deviceAuthResponse = ref({
- user_code: '',
- verification_uri: '',
- device_code: ''
-})
-const deviceAuthNext = () => {
- if (deviceAuthActive.value++ > 2) {
- return
- }
-
- if (deviceAuthActive.value === 1) {
- fetch('/oauth2/getLocalCode')
- .then(API.DefaultResponseProcess)
- .then((d) => {
- deviceAuthResponse.value = d
- })
- } else if (deviceAuthActive.value === 2) {
- window.location.href = '/oauth2/getUserInfoFromLocalCode?device_code=' + deviceAuthResponse.value.device_code
- }
-}
-
@@ -290,34 +267,6 @@ const deviceAuthNext = () => {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Open
this link, and type the code:
{{
- deviceAuthResponse.user_code }}. Then click the next step button.
-
- Next step
-
-
-