samaro-uitest 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +336 -0
- package/bin/samaro-allure.js +172 -0
- package/bin/samaro-init.js +278 -0
- package/bin/samaro-test.js +36 -0
- package/config/index.d.ts +4 -0
- package/config/index.d.ts.map +1 -0
- package/config/index.js +11 -0
- package/config/index.js.map +1 -0
- package/config/index.ts +3 -0
- package/config/playwright.component.config.d.ts +12 -0
- package/config/playwright.component.config.d.ts.map +1 -0
- package/config/playwright.component.config.js +42 -0
- package/config/playwright.component.config.js.map +1 -0
- package/config/playwright.component.config.ts +60 -0
- package/config/playwright.config.d.ts +14 -0
- package/config/playwright.config.d.ts.map +1 -0
- package/config/playwright.config.js +53 -0
- package/config/playwright.config.js.map +1 -0
- package/config/playwright.config.ts +76 -0
- package/config/test-setup.ts +17 -0
- package/config/vitest.config.d.ts +13 -0
- package/config/vitest.config.d.ts.map +1 -0
- package/config/vitest.config.js +53 -0
- package/config/vitest.config.js.map +1 -0
- package/config/vitest.config.ts +64 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/playwright.component.config.d.ts +12 -0
- package/dist/config/playwright.component.config.d.ts.map +1 -0
- package/dist/config/playwright.component.config.js +39 -0
- package/dist/config/playwright.component.config.js.map +1 -0
- package/dist/config/playwright.config.d.ts +14 -0
- package/dist/config/playwright.config.d.ts.map +1 -0
- package/dist/config/playwright.config.js +50 -0
- package/dist/config/playwright.config.js.map +1 -0
- package/dist/config/test-setup.d.ts +3 -0
- package/dist/config/test-setup.d.ts.map +1 -0
- package/dist/config/test-setup.js +17 -0
- package/dist/config/test-setup.js.map +1 -0
- package/dist/config/vitest.config.d.ts +13 -0
- package/dist/config/vitest.config.d.ts.map +1 -0
- package/dist/config/vitest.config.js +46 -0
- package/dist/config/vitest.config.js.map +1 -0
- package/dist/helpers/api.d.ts +69 -0
- package/dist/helpers/api.d.ts.map +1 -0
- package/dist/helpers/api.js +154 -0
- package/dist/helpers/api.js.map +1 -0
- package/dist/helpers/auth.d.ts +35 -0
- package/dist/helpers/auth.d.ts.map +1 -0
- package/dist/helpers/auth.js +96 -0
- package/dist/helpers/auth.js.map +1 -0
- package/dist/helpers/config.d.ts +34 -0
- package/dist/helpers/config.d.ts.map +1 -0
- package/dist/helpers/config.js +63 -0
- package/dist/helpers/config.js.map +1 -0
- package/dist/helpers/debug.d.ts +48 -0
- package/dist/helpers/debug.d.ts.map +1 -0
- package/dist/helpers/debug.js +76 -0
- package/dist/helpers/debug.js.map +1 -0
- package/dist/helpers/index.d.ts +6 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +11 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/setup.d.ts +50 -0
- package/dist/helpers/setup.d.ts.map +1 -0
- package/dist/helpers/setup.js +95 -0
- package/dist/helpers/setup.js.map +1 -0
- package/dist/src/index.d.ts +16 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +38 -0
- package/dist/src/index.js.map +1 -0
- package/helpers/api.d.ts +69 -0
- package/helpers/api.d.ts.map +1 -0
- package/helpers/api.js +163 -0
- package/helpers/api.js.map +1 -0
- package/helpers/api.ts +224 -0
- package/helpers/auth.d.ts +35 -0
- package/helpers/auth.d.ts.map +1 -0
- package/helpers/auth.js +104 -0
- package/helpers/auth.js.map +1 -0
- package/helpers/auth.ts +125 -0
- package/helpers/config.d.ts +34 -0
- package/helpers/config.d.ts.map +1 -0
- package/helpers/config.js +70 -0
- package/helpers/config.js.map +1 -0
- package/helpers/config.ts +80 -0
- package/helpers/debug.d.ts +48 -0
- package/helpers/debug.d.ts.map +1 -0
- package/helpers/debug.js +86 -0
- package/helpers/debug.js.map +1 -0
- package/helpers/debug.ts +111 -0
- package/helpers/index.d.ts +6 -0
- package/helpers/index.d.ts.map +1 -0
- package/helpers/index.js +47 -0
- package/helpers/index.js.map +1 -0
- package/helpers/index.ts +62 -0
- package/helpers/setup.d.ts +50 -0
- package/helpers/setup.d.ts.map +1 -0
- package/helpers/setup.js +137 -0
- package/helpers/setup.js.map +1 -0
- package/helpers/setup.ts +144 -0
- package/package.json +94 -0
- package/schematics/collection.json +11 -0
- package/schematics/ng-add/index.js +121 -0
- package/schematics/ng-add/schema.json +26 -0
- package/scripts/check-allure-results.js +269 -0
- package/types/allure.d.ts +76 -0
- package/types/global.d.ts +49 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.mergeConfig = void 0;
|
|
7
|
+
exports.createVitestConfig = createVitestConfig;
|
|
8
|
+
const config_1 = require("vitest/config");
|
|
9
|
+
Object.defineProperty(exports, "mergeConfig", { enumerable: true, get: function () { return config_1.mergeConfig; } });
|
|
10
|
+
const vite_plugin_angular_1 = __importDefault(require("@analogjs/vite-plugin-angular"));
|
|
11
|
+
const node_url_1 = require("node:url");
|
|
12
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
13
|
+
function createVitestConfig(options = {}) {
|
|
14
|
+
const { projectRoot = process.cwd(), testGlob = 'src/**/*.spec.ts', resultsDir = 'allure-unit-results', setupFiles = [], alias = {}, } = options;
|
|
15
|
+
const defaultSetupFile = node_path_1.default.join(__dirname, 'test-setup.ts');
|
|
16
|
+
const allSetupFiles = [defaultSetupFile, ...setupFiles];
|
|
17
|
+
const testPatterns = Array.isArray(testGlob) ? testGlob : [testGlob];
|
|
18
|
+
return (0, config_1.defineConfig)({
|
|
19
|
+
plugins: [(0, vite_plugin_angular_1.default)()],
|
|
20
|
+
test: {
|
|
21
|
+
globals: false,
|
|
22
|
+
environment: 'jsdom',
|
|
23
|
+
setupFiles: allSetupFiles,
|
|
24
|
+
include: testPatterns,
|
|
25
|
+
pool: 'threads',
|
|
26
|
+
reporters: [
|
|
27
|
+
'default',
|
|
28
|
+
[
|
|
29
|
+
'allure-vitest/reporter',
|
|
30
|
+
{
|
|
31
|
+
resultsDir,
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
],
|
|
35
|
+
coverage: {
|
|
36
|
+
provider: 'v8',
|
|
37
|
+
reporter: ['text', 'json', 'html'],
|
|
38
|
+
reportsDirectory: 'coverage',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
define: {
|
|
42
|
+
ngDevMode: true,
|
|
43
|
+
},
|
|
44
|
+
resolve: {
|
|
45
|
+
alias: {
|
|
46
|
+
'@': (0, node_url_1.fileURLToPath)(new URL('./src', import.meta.url)),
|
|
47
|
+
...alias,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
exports.default = createVitestConfig();
|
|
53
|
+
//# sourceMappingURL=vitest.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["vitest.config.ts"],"names":[],"mappings":";;;;;;AAaA,gDA+CC;AA5DD,0CAA0D;AA8DjD,4FA9Dc,oBAAW,OA8Dd;AA7DpB,wFAAoD;AACpD,uCAAyC;AACzC,0DAA6B;AAU7B,SAAgB,kBAAkB,CAAC,UAA+B,EAAE;IAClE,MAAM,EACJ,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,EAC3B,QAAQ,GAAG,kBAAkB,EAC7B,UAAU,GAAG,qBAAqB,EAClC,UAAU,GAAG,EAAE,EACf,KAAK,GAAG,EAAE,GACX,GAAG,OAAO,CAAC;IAEZ,MAAM,gBAAgB,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,CAAC,gBAAgB,EAAE,GAAG,UAAU,CAAC,CAAC;IAExD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAErE,OAAO,IAAA,qBAAY,EAAC;QAClB,OAAO,EAAE,CAAC,IAAA,6BAAO,GAAE,CAAC;QACpB,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,OAAO;YACpB,UAAU,EAAE,aAAa;YACzB,OAAO,EAAE,YAAY;YACrB,IAAI,EAAE,SAAS;YACf,SAAS,EAAE;gBACT,SAAS;gBACT;oBACE,wBAAwB;oBACxB;wBACE,UAAU;qBACX;iBACF;aACF;YACD,QAAQ,EAAE;gBACR,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAClC,gBAAgB,EAAE,UAAU;aAC7B;SACF;QACD,MAAM,EAAE;YACN,SAAS,EAAE,IAAI;SAChB;QACD,OAAO,EAAE;YACP,KAAK,EAAE;gBACL,GAAG,EAAE,IAAA,wBAAa,EAAC,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrD,GAAG,KAAK;aACT;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAGD,kBAAe,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { defineConfig, mergeConfig } from 'vitest/config';
|
|
2
|
+
import angular from '@analogjs/vite-plugin-angular';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
|
|
6
|
+
export interface SamaroVitestOptions {
|
|
7
|
+
projectRoot?: string;
|
|
8
|
+
testGlob?: string | string[];
|
|
9
|
+
resultsDir?: string;
|
|
10
|
+
setupFiles?: string[];
|
|
11
|
+
alias?: Record<string, string>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function createVitestConfig(options: SamaroVitestOptions = {}) {
|
|
15
|
+
const {
|
|
16
|
+
projectRoot = process.cwd(),
|
|
17
|
+
testGlob = 'src/**/*.spec.ts',
|
|
18
|
+
resultsDir = 'allure-unit-results',
|
|
19
|
+
setupFiles = [],
|
|
20
|
+
alias = {},
|
|
21
|
+
} = options;
|
|
22
|
+
|
|
23
|
+
const defaultSetupFile = path.join(__dirname, 'test-setup.ts');
|
|
24
|
+
const allSetupFiles = [defaultSetupFile, ...setupFiles];
|
|
25
|
+
|
|
26
|
+
const testPatterns = Array.isArray(testGlob) ? testGlob : [testGlob];
|
|
27
|
+
|
|
28
|
+
return defineConfig({
|
|
29
|
+
plugins: [angular()],
|
|
30
|
+
test: {
|
|
31
|
+
globals: false,
|
|
32
|
+
environment: 'jsdom',
|
|
33
|
+
setupFiles: allSetupFiles,
|
|
34
|
+
include: testPatterns,
|
|
35
|
+
pool: 'threads',
|
|
36
|
+
reporters: [
|
|
37
|
+
'default',
|
|
38
|
+
[
|
|
39
|
+
'allure-vitest/reporter',
|
|
40
|
+
{
|
|
41
|
+
resultsDir,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
],
|
|
45
|
+
coverage: {
|
|
46
|
+
provider: 'v8',
|
|
47
|
+
reporter: ['text', 'json', 'html'],
|
|
48
|
+
reportsDirectory: 'coverage',
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
define: {
|
|
52
|
+
ngDevMode: true,
|
|
53
|
+
},
|
|
54
|
+
resolve: {
|
|
55
|
+
alias: {
|
|
56
|
+
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
|
57
|
+
...alias,
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export { mergeConfig };
|
|
64
|
+
export default createVitestConfig();
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createVitestConfig, mergeConfig, type SamaroVitestOptions } from './vitest.config';
|
|
2
|
+
export { createPlaywrightConfig, type SamaroPlaywrightOptions } from './playwright.config';
|
|
3
|
+
export { createComponentConfig, type SamaroComponentOptions } from './playwright.component.config';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,sBAAsB,EAAE,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAA4B,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,sBAAsB,EAAgC,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAA+B,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { PlaywrightTestConfig } from '@playwright/test';
|
|
2
|
+
export interface SamaroComponentOptions {
|
|
3
|
+
baseURL?: string;
|
|
4
|
+
testDir?: string;
|
|
5
|
+
resultsDir?: string;
|
|
6
|
+
webServerCommand?: string;
|
|
7
|
+
webServerPort?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function createComponentConfig(options?: SamaroComponentOptions): PlaywrightTestConfig;
|
|
10
|
+
declare const _default: PlaywrightTestConfig;
|
|
11
|
+
export default _default;
|
|
12
|
+
//# sourceMappingURL=playwright.component.config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright.component.config.d.ts","sourceRoot":"","sources":["../../config/playwright.component.config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,oBAAoB,CA8ChG;;AAED,wBAAuC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { defineConfig, devices } from '@playwright/test';
|
|
2
|
+
export function createComponentConfig(options = {}) {
|
|
3
|
+
const { baseURL = 'http://localhost:4200', testDir = './ct-tests', resultsDir = 'allure-ct-results', webServerCommand = 'npm run start', webServerPort = 4200, } = options;
|
|
4
|
+
return defineConfig({
|
|
5
|
+
testDir,
|
|
6
|
+
fullyParallel: true,
|
|
7
|
+
forbidOnly: !!process.env.CI,
|
|
8
|
+
retries: process.env.CI ? 2 : 0,
|
|
9
|
+
workers: process.env.CI ? 1 : undefined,
|
|
10
|
+
reporter: [
|
|
11
|
+
['allure-playwright', {
|
|
12
|
+
resultsDir,
|
|
13
|
+
detail: true,
|
|
14
|
+
suiteTitle: true,
|
|
15
|
+
}],
|
|
16
|
+
['html', { outputFolder: 'playwright-component-report' }],
|
|
17
|
+
['list'],
|
|
18
|
+
],
|
|
19
|
+
use: {
|
|
20
|
+
baseURL,
|
|
21
|
+
trace: 'on-first-retry',
|
|
22
|
+
screenshot: 'only-on-failure',
|
|
23
|
+
},
|
|
24
|
+
projects: [
|
|
25
|
+
{
|
|
26
|
+
name: 'chromium',
|
|
27
|
+
use: { ...devices['Desktop Chrome'] },
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
webServer: {
|
|
31
|
+
command: webServerCommand,
|
|
32
|
+
url: `http://localhost:${webServerPort}`,
|
|
33
|
+
reuseExistingServer: !process.env.CI,
|
|
34
|
+
timeout: 120000,
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
export default createComponentConfig();
|
|
39
|
+
//# sourceMappingURL=playwright.component.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright.component.config.js","sourceRoot":"","sources":["../../config/playwright.component.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAWzD,MAAM,UAAU,qBAAqB,CAAC,UAAkC,EAAE;IACxE,MAAM,EACJ,OAAO,GAAG,uBAAuB,EACjC,OAAO,GAAG,YAAY,EACtB,UAAU,GAAG,mBAAmB,EAChC,gBAAgB,GAAG,eAAe,EAClC,aAAa,GAAG,IAAI,GACrB,GAAG,OAAO,CAAC;IAEZ,OAAO,YAAY,CAAC;QAClB,OAAO;QACP,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QAC5B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;QAEvC,QAAQ,EAAE;YACR,CAAC,mBAAmB,EAAE;oBACpB,UAAU;oBACV,MAAM,EAAE,IAAI;oBACZ,UAAU,EAAE,IAAI;iBACjB,CAAC;YACF,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,6BAA6B,EAAE,CAAC;YACzD,CAAC,MAAM,CAAC;SACT;QAED,GAAG,EAAE;YACH,OAAO;YACP,KAAK,EAAE,gBAAgB;YACvB,UAAU,EAAE,iBAAiB;SAC9B;QAED,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,UAAU;gBAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE;aACtC;SACF;QAED,SAAS,EAAE;YACT,OAAO,EAAE,gBAAgB;YACzB,GAAG,EAAE,oBAAoB,aAAa,EAAE;YACxC,mBAAmB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACpC,OAAO,EAAE,MAAO;SACjB;KACF,CAAC,CAAC;AACL,CAAC;AAED,eAAe,qBAAqB,EAAE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PlaywrightTestConfig } from '@playwright/test';
|
|
2
|
+
export interface SamaroPlaywrightOptions {
|
|
3
|
+
baseURL?: string;
|
|
4
|
+
testDir?: string;
|
|
5
|
+
resultsDir?: string;
|
|
6
|
+
webServerCommand?: string;
|
|
7
|
+
webServerPort?: number;
|
|
8
|
+
webServerTimeout?: number;
|
|
9
|
+
timeout?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function createPlaywrightConfig(options?: SamaroPlaywrightOptions): PlaywrightTestConfig;
|
|
12
|
+
declare const _default: PlaywrightTestConfig<{}, {}>;
|
|
13
|
+
export default _default;
|
|
14
|
+
//# sourceMappingURL=playwright.config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright.config.d.ts","sourceRoot":"","sources":["../../config/playwright.config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,oBAAoB,CA4DlG;;AAED,wBAAsD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { defineConfig, devices } from '@playwright/test';
|
|
2
|
+
export function createPlaywrightConfig(options = {}) {
|
|
3
|
+
const { baseURL = 'http://localhost:4200', testDir = './e2e', resultsDir = 'allure-e2e-results', webServerCommand = 'npm run start', webServerPort = 4200, webServerTimeout = 120000, timeout = 15000, } = options;
|
|
4
|
+
return {
|
|
5
|
+
testDir,
|
|
6
|
+
fullyParallel: false,
|
|
7
|
+
forbidOnly: !!process.env.CI,
|
|
8
|
+
retries: process.env.CI ? 2 : 1,
|
|
9
|
+
workers: 1,
|
|
10
|
+
timeout,
|
|
11
|
+
reporter: [
|
|
12
|
+
['allure-playwright', {
|
|
13
|
+
resultsDir,
|
|
14
|
+
detail: true,
|
|
15
|
+
suiteTitle: true,
|
|
16
|
+
environmentInfo: {
|
|
17
|
+
framework: 'playwright',
|
|
18
|
+
os_platform: process.platform,
|
|
19
|
+
node_version: process.version,
|
|
20
|
+
},
|
|
21
|
+
}],
|
|
22
|
+
['html', { outputFolder: 'playwright-report' }],
|
|
23
|
+
['list'],
|
|
24
|
+
],
|
|
25
|
+
use: {
|
|
26
|
+
baseURL,
|
|
27
|
+
trace: 'on-first-retry',
|
|
28
|
+
screenshot: 'only-on-failure',
|
|
29
|
+
actionTimeout: 5000,
|
|
30
|
+
navigationTimeout: 10000,
|
|
31
|
+
},
|
|
32
|
+
expect: {
|
|
33
|
+
timeout: 5000,
|
|
34
|
+
},
|
|
35
|
+
projects: [
|
|
36
|
+
{
|
|
37
|
+
name: 'chromium',
|
|
38
|
+
use: { ...devices['Desktop Chrome'] },
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
webServer: {
|
|
42
|
+
command: webServerCommand,
|
|
43
|
+
url: `http://localhost:${webServerPort}`,
|
|
44
|
+
reuseExistingServer: !process.env.CI,
|
|
45
|
+
timeout: webServerTimeout,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export default defineConfig(createPlaywrightConfig());
|
|
50
|
+
//# sourceMappingURL=playwright.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright.config.js","sourceRoot":"","sources":["../../config/playwright.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAazD,MAAM,UAAU,sBAAsB,CAAC,UAAmC,EAAE;IAC1E,MAAM,EACJ,OAAO,GAAG,uBAAuB,EACjC,OAAO,GAAG,OAAO,EACjB,UAAU,GAAG,oBAAoB,EACjC,gBAAgB,GAAG,eAAe,EAClC,aAAa,GAAG,IAAI,EACpB,gBAAgB,GAAG,MAAO,EAC1B,OAAO,GAAG,KAAM,GACjB,GAAG,OAAO,CAAC;IAEZ,OAAO;QACL,OAAO;QACP,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QAC5B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO,EAAE,CAAC;QACV,OAAO;QAEP,QAAQ,EAAE;YACR,CAAC,mBAAmB,EAAE;oBACpB,UAAU;oBACV,MAAM,EAAE,IAAI;oBACZ,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE;wBACf,SAAS,EAAE,YAAY;wBACvB,WAAW,EAAE,OAAO,CAAC,QAAQ;wBAC7B,YAAY,EAAE,OAAO,CAAC,OAAO;qBAC9B;iBACF,CAAC;YACF,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,mBAAmB,EAAE,CAAC;YAC/C,CAAC,MAAM,CAAC;SACT;QAED,GAAG,EAAE;YACH,OAAO;YACP,KAAK,EAAE,gBAAgB;YACvB,UAAU,EAAE,iBAAiB;YAC7B,aAAa,EAAE,IAAK;YACpB,iBAAiB,EAAE,KAAM;SAC1B;QAED,MAAM,EAAE;YACN,OAAO,EAAE,IAAK;SACf;QAED,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,UAAU;gBAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE;aACtC;SACF;QAED,SAAS,EAAE;YACT,OAAO,EAAE,gBAAgB;YACzB,GAAG,EAAE,oBAAoB,aAAa,EAAE;YACxC,mBAAmB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACpC,OAAO,EAAE,gBAAgB;SAC1B;KACF,CAAC;AACJ,CAAC;AAED,eAAe,YAAY,CAAC,sBAAsB,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-setup.d.ts","sourceRoot":"","sources":["../../config/test-setup.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,CAAC;AACjB,OAAO,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import 'zone.js';
|
|
2
|
+
import 'zone.js/testing';
|
|
3
|
+
import { getTestBed } from '@angular/core/testing';
|
|
4
|
+
import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing';
|
|
5
|
+
console.log('🚀 SamaroUItest - Test setup file is being loaded!');
|
|
6
|
+
// Initialize the Angular testing environment once
|
|
7
|
+
try {
|
|
8
|
+
getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting(), {
|
|
9
|
+
teardown: { destroyAfterEach: true },
|
|
10
|
+
});
|
|
11
|
+
console.log('✅ TestBed initialized successfully');
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
console.error('❌ TestBed initialization failed:', error);
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=test-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-setup.js","sourceRoot":"","sources":["../../config/test-setup.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,CAAC;AACjB,OAAO,iBAAiB,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,MAAM,2CAA2C,CAAC;AAEvH,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;AAElE,kDAAkD;AAClD,IAAI,CAAC;IACH,UAAU,EAAE,CAAC,mBAAmB,CAAC,2BAA2B,EAAE,6BAA6B,EAAE,EAAE;QAC7F,QAAQ,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE;KACrC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;AACpD,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;IACzD,MAAM,KAAK,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { mergeConfig } from 'vitest/config';
|
|
2
|
+
export interface SamaroVitestOptions {
|
|
3
|
+
projectRoot?: string;
|
|
4
|
+
testGlob?: string | string[];
|
|
5
|
+
resultsDir?: string;
|
|
6
|
+
setupFiles?: string[];
|
|
7
|
+
alias?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export declare function createVitestConfig(options?: SamaroVitestOptions): import("vite").UserConfig;
|
|
10
|
+
export { mergeConfig };
|
|
11
|
+
declare const _default: import("vite").UserConfig;
|
|
12
|
+
export default _default;
|
|
13
|
+
//# sourceMappingURL=vitest.config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.config.d.ts","sourceRoot":"","sources":["../../config/vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,WAAW,EAAE,MAAM,eAAe,CAAC;AAK1D,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,6BA+CnE;AAED,OAAO,EAAE,WAAW,EAAE,CAAC;;AACvB,wBAAoC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { defineConfig, mergeConfig } from 'vitest/config';
|
|
2
|
+
import angular from '@analogjs/vite-plugin-angular';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
export function createVitestConfig(options = {}) {
|
|
6
|
+
const { projectRoot = process.cwd(), testGlob = 'src/**/*.spec.ts', resultsDir = 'allure-unit-results', setupFiles = [], alias = {}, } = options;
|
|
7
|
+
const defaultSetupFile = path.join(__dirname, 'test-setup.ts');
|
|
8
|
+
const allSetupFiles = [defaultSetupFile, ...setupFiles];
|
|
9
|
+
const testPatterns = Array.isArray(testGlob) ? testGlob : [testGlob];
|
|
10
|
+
return defineConfig({
|
|
11
|
+
plugins: [angular()],
|
|
12
|
+
test: {
|
|
13
|
+
globals: false,
|
|
14
|
+
environment: 'jsdom',
|
|
15
|
+
setupFiles: allSetupFiles,
|
|
16
|
+
include: testPatterns,
|
|
17
|
+
pool: 'threads',
|
|
18
|
+
reporters: [
|
|
19
|
+
'default',
|
|
20
|
+
[
|
|
21
|
+
'allure-vitest/reporter',
|
|
22
|
+
{
|
|
23
|
+
resultsDir,
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
],
|
|
27
|
+
coverage: {
|
|
28
|
+
provider: 'v8',
|
|
29
|
+
reporter: ['text', 'json', 'html'],
|
|
30
|
+
reportsDirectory: 'coverage',
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
define: {
|
|
34
|
+
ngDevMode: true,
|
|
35
|
+
},
|
|
36
|
+
resolve: {
|
|
37
|
+
alias: {
|
|
38
|
+
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
|
39
|
+
...alias,
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export { mergeConfig };
|
|
45
|
+
export default createVitestConfig();
|
|
46
|
+
//# sourceMappingURL=vitest.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../../config/vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,OAAO,MAAM,+BAA+B,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,MAAM,UAAU,kBAAkB,CAAC,UAA+B,EAAE;IAClE,MAAM,EACJ,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,EAC3B,QAAQ,GAAG,kBAAkB,EAC7B,UAAU,GAAG,qBAAqB,EAClC,UAAU,GAAG,EAAE,EACf,KAAK,GAAG,EAAE,GACX,GAAG,OAAO,CAAC;IAEZ,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,CAAC,gBAAgB,EAAE,GAAG,UAAU,CAAC,CAAC;IAExD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAErE,OAAO,YAAY,CAAC;QAClB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,OAAO;YACpB,UAAU,EAAE,aAAa;YACzB,OAAO,EAAE,YAAY;YACrB,IAAI,EAAE,SAAS;YACf,SAAS,EAAE;gBACT,SAAS;gBACT;oBACE,wBAAwB;oBACxB;wBACE,UAAU;qBACX;iBACF;aACF;YACD,QAAQ,EAAE;gBACR,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAClC,gBAAgB,EAAE,UAAU;aAC7B;SACF;QACD,MAAM,EAAE;YACN,SAAS,EAAE,IAAI;SAChB;QACD,OAAO,EAAE;YACP,KAAK,EAAE;gBACL,GAAG,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrD,GAAG,KAAK;aACT;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,eAAe,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { APIRequestContext } from '@playwright/test';
|
|
2
|
+
export interface APIConfig {
|
|
3
|
+
baseURL: string;
|
|
4
|
+
}
|
|
5
|
+
export interface APIUser {
|
|
6
|
+
username: string;
|
|
7
|
+
email: string;
|
|
8
|
+
password: string;
|
|
9
|
+
}
|
|
10
|
+
export interface APIAuthResponse {
|
|
11
|
+
user: {
|
|
12
|
+
email: string;
|
|
13
|
+
token: string;
|
|
14
|
+
username: string;
|
|
15
|
+
bio: string | null;
|
|
16
|
+
image: string | null;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get API configuration from environment variables
|
|
21
|
+
*/
|
|
22
|
+
export declare function getAPIConfig(): APIConfig;
|
|
23
|
+
/**
|
|
24
|
+
* Register a user via API
|
|
25
|
+
*/
|
|
26
|
+
export declare function registerUserViaAPI(request: APIRequestContext, user: APIUser): Promise<{
|
|
27
|
+
token: string;
|
|
28
|
+
username: string;
|
|
29
|
+
email: string;
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* Login a user via API
|
|
33
|
+
*/
|
|
34
|
+
export declare function loginUserViaAPI(request: APIRequestContext, email: string, password: string): Promise<{
|
|
35
|
+
token: string;
|
|
36
|
+
username: string;
|
|
37
|
+
email: string;
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Create an article via API
|
|
41
|
+
*/
|
|
42
|
+
export declare function createArticleViaAPI(request: APIRequestContext, token: string, article: {
|
|
43
|
+
title: string;
|
|
44
|
+
description: string;
|
|
45
|
+
body: string;
|
|
46
|
+
tagList?: string[];
|
|
47
|
+
}): Promise<{
|
|
48
|
+
slug: string;
|
|
49
|
+
title: string;
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* Delete an article via API
|
|
53
|
+
*/
|
|
54
|
+
export declare function deleteArticleViaAPI(request: APIRequestContext, token: string, slug: string): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Update user via API
|
|
57
|
+
*/
|
|
58
|
+
export declare function updateUserViaAPI(request: APIRequestContext, token: string, updates: {
|
|
59
|
+
email?: string;
|
|
60
|
+
bio?: string;
|
|
61
|
+
image?: string;
|
|
62
|
+
username?: string;
|
|
63
|
+
password?: string;
|
|
64
|
+
}): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Get current user via API
|
|
67
|
+
*/
|
|
68
|
+
export declare function getCurrentUserViaAPI(request: APIRequestContext, token: string): Promise<APIAuthResponse['user']>;
|
|
69
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../helpers/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;KACtB,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAIxC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB7D;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB7D;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IACP,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,GACA,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB1C;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAoBlC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get API configuration from environment variables
|
|
3
|
+
*/
|
|
4
|
+
export function getAPIConfig() {
|
|
5
|
+
return {
|
|
6
|
+
baseURL: process.env.API_BASE || process.env.NG_API_URL || 'http://localhost:4200/api',
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Register a user via API
|
|
11
|
+
*/
|
|
12
|
+
export async function registerUserViaAPI(request, user) {
|
|
13
|
+
const config = getAPIConfig();
|
|
14
|
+
try {
|
|
15
|
+
const response = await request.post(`${config.baseURL}/users`, {
|
|
16
|
+
data: { user },
|
|
17
|
+
headers: {
|
|
18
|
+
'Content-Type': 'application/json',
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
if (!response.ok()) {
|
|
22
|
+
const errorText = await response.text();
|
|
23
|
+
throw new Error(`API registration failed (${response.status()}): ${errorText}`);
|
|
24
|
+
}
|
|
25
|
+
const data = await response.json();
|
|
26
|
+
return {
|
|
27
|
+
token: data.user.token,
|
|
28
|
+
username: data.user.username,
|
|
29
|
+
email: data.user.email,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
throw new Error(`Failed to register user via API: ${error}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Login a user via API
|
|
38
|
+
*/
|
|
39
|
+
export async function loginUserViaAPI(request, email, password) {
|
|
40
|
+
const config = getAPIConfig();
|
|
41
|
+
try {
|
|
42
|
+
const response = await request.post(`${config.baseURL}/users/login`, {
|
|
43
|
+
data: { user: { email, password } },
|
|
44
|
+
headers: {
|
|
45
|
+
'Content-Type': 'application/json',
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok()) {
|
|
49
|
+
const errorText = await response.text();
|
|
50
|
+
throw new Error(`API login failed (${response.status()}): ${errorText}`);
|
|
51
|
+
}
|
|
52
|
+
const data = await response.json();
|
|
53
|
+
return {
|
|
54
|
+
token: data.user.token,
|
|
55
|
+
username: data.user.username,
|
|
56
|
+
email: data.user.email,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
throw new Error(`Failed to login user via API: ${error}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create an article via API
|
|
65
|
+
*/
|
|
66
|
+
export async function createArticleViaAPI(request, token, article) {
|
|
67
|
+
const config = getAPIConfig();
|
|
68
|
+
try {
|
|
69
|
+
const response = await request.post(`${config.baseURL}/articles`, {
|
|
70
|
+
data: { article },
|
|
71
|
+
headers: {
|
|
72
|
+
'Content-Type': 'application/json',
|
|
73
|
+
'Authorization': `Token ${token}`,
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
if (!response.ok()) {
|
|
77
|
+
const errorText = await response.text();
|
|
78
|
+
throw new Error(`API article creation failed (${response.status()}): ${errorText}`);
|
|
79
|
+
}
|
|
80
|
+
const data = await response.json();
|
|
81
|
+
return {
|
|
82
|
+
slug: data.article.slug,
|
|
83
|
+
title: data.article.title,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
throw new Error(`Failed to create article via API: ${error}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Delete an article via API
|
|
92
|
+
*/
|
|
93
|
+
export async function deleteArticleViaAPI(request, token, slug) {
|
|
94
|
+
const config = getAPIConfig();
|
|
95
|
+
try {
|
|
96
|
+
const response = await request.delete(`${config.baseURL}/articles/${slug}`, {
|
|
97
|
+
headers: {
|
|
98
|
+
'Authorization': `Token ${token}`,
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
if (!response.ok()) {
|
|
102
|
+
const errorText = await response.text();
|
|
103
|
+
throw new Error(`API article deletion failed (${response.status()}): ${errorText}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
throw new Error(`Failed to delete article via API: ${error}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Update user via API
|
|
112
|
+
*/
|
|
113
|
+
export async function updateUserViaAPI(request, token, updates) {
|
|
114
|
+
const config = getAPIConfig();
|
|
115
|
+
try {
|
|
116
|
+
const response = await request.put(`${config.baseURL}/user`, {
|
|
117
|
+
data: { user: updates },
|
|
118
|
+
headers: {
|
|
119
|
+
'Content-Type': 'application/json',
|
|
120
|
+
'Authorization': `Token ${token}`,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
if (!response.ok()) {
|
|
124
|
+
const errorText = await response.text();
|
|
125
|
+
throw new Error(`API user update failed (${response.status()}): ${errorText}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
throw new Error(`Failed to update user via API: ${error}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get current user via API
|
|
134
|
+
*/
|
|
135
|
+
export async function getCurrentUserViaAPI(request, token) {
|
|
136
|
+
const config = getAPIConfig();
|
|
137
|
+
try {
|
|
138
|
+
const response = await request.get(`${config.baseURL}/user`, {
|
|
139
|
+
headers: {
|
|
140
|
+
'Authorization': `Token ${token}`,
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
if (!response.ok()) {
|
|
144
|
+
const errorText = await response.text();
|
|
145
|
+
throw new Error(`API get user failed (${response.status()}): ${errorText}`);
|
|
146
|
+
}
|
|
147
|
+
const data = await response.json();
|
|
148
|
+
return data.user;
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
throw new Error(`Failed to get current user via API: ${error}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../helpers/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Page } from '@playwright/test';
|
|
2
|
+
export interface UserCredentials {
|
|
3
|
+
username: string;
|
|
4
|
+
email: string;
|
|
5
|
+
password: string;
|
|
6
|
+
}
|
|
7
|
+
export interface AuthResult {
|
|
8
|
+
success: boolean;
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Register a new user via UI
|
|
13
|
+
*/
|
|
14
|
+
export declare function register(page: Page, username: string, email: string, password: string): Promise<AuthResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Login a user via UI
|
|
17
|
+
*/
|
|
18
|
+
export declare function login(page: Page, email: string, password: string): Promise<AuthResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Logout a user via UI
|
|
21
|
+
*/
|
|
22
|
+
export declare function logout(page: Page): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Generate unique user credentials to avoid conflicts
|
|
25
|
+
*/
|
|
26
|
+
export declare function generateUniqueUser(): UserCredentials;
|
|
27
|
+
/**
|
|
28
|
+
* Check if user is logged in
|
|
29
|
+
*/
|
|
30
|
+
export declare function isLoggedIn(page: Page): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Get current username if logged in
|
|
33
|
+
*/
|
|
34
|
+
export declare function getCurrentUsername(page: Page): Promise<string | null>;
|
|
35
|
+
//# sourceMappingURL=auth.d.ts.map
|