automacao-core-carga-back 1.0.2

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/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "automacao-core-carga-back",
3
+ "version": "1.0.2",
4
+ "description": "Core compartilhado de utilitários k6 e Playwright para testes de carga dos módulos erpx_* e erp_*",
5
+ "exports": {
6
+ "./k6": {
7
+ "types": "./src/types/k6.d.ts",
8
+ "import": "./dist/k6.mjs",
9
+ "require": "./dist/k6.cjs"
10
+ },
11
+ "./playwright": {
12
+ "types": "./src/types/playwright.d.ts",
13
+ "import": "./dist/playwright.mjs",
14
+ "require": "./dist/playwright.cjs"
15
+ },
16
+ "./package.json": "./package.json"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "src/types"
21
+ ],
22
+ "scripts": {
23
+ "build": "npm install && rollup -c",
24
+ "eslint": "eslint . --ignore-path .eslintignore"
25
+ },
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/senior-sistemas/snr-automacao-core-carga-back.git"
29
+ },
30
+ "bugs": {
31
+ "url": "https://github.com/senior-sistemas/snr-automacao-core-carga-back/issues"
32
+ },
33
+ "homepage": "https://github.com/senior-sistemas/snr-automacao-core-carga-back#readme",
34
+ "keywords": [
35
+ "k6",
36
+ "playwright",
37
+ "performance",
38
+ "carga",
39
+ "senior",
40
+ "erpx"
41
+ ],
42
+ "author": "",
43
+ "license": "ISC",
44
+ "devDependencies": {
45
+ "@babel/cli": "^7.24.5",
46
+ "@babel/core": "^7.24.5",
47
+ "@babel/eslint-parser": "^7.24.1",
48
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
49
+ "@babel/plugin-transform-object-rest-spread": "^7.24.5",
50
+ "@babel/preset-env": "^7.24.5",
51
+ "@playwright/test": "1.63.0",
52
+ "@rollup/plugin-babel": "^6.0.4",
53
+ "@rollup/plugin-node-resolve": "^15.2.3",
54
+ "@types/node": "^20.12.8",
55
+ "@types/k6": "^0.50.0",
56
+ "eslint": "^8.57.0",
57
+ "eslint-plugin-import": "^2.29.1",
58
+ "eslint-plugin-playwright": "^1.5.1",
59
+ "rollup": "^2.0.0"
60
+ },
61
+ "dependencies": {
62
+ "automacao-core-playwright": "^5.18.1",
63
+ "sharp": "^0.34.5"
64
+ },
65
+ "peerDependencies": {
66
+ "@playwright/test": ">=1.40.0"
67
+ },
68
+ "peerDependenciesMeta": {
69
+ "@playwright/test": {
70
+ "optional": true
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Declarações de tipo de `automacao-core-carga-back/k6`.
3
+ *
4
+ * Self-contained de propósito: não re-exporta os arquivos de `src/lib/`, que não
5
+ * são publicados no pacote, e não depende de `@types/k6` estar instalado no
6
+ * repositório consumidor.
7
+ */
8
+
9
+ /** Headers para requisições autenticadas, montados por `K6AuthUtils.paramsHeader`. */
10
+ export interface ParamsHeader {
11
+ headers: {
12
+ 'Content-Type': string;
13
+ Authorization: string;
14
+ };
15
+ }
16
+
17
+ /** Subconjunto da Response do k6 usado por este core. */
18
+ export interface RespostaHttp {
19
+ status: number;
20
+ body: string | null;
21
+ timings: { duration: number };
22
+ json(selector?: string): unknown;
23
+ [chave: string]: unknown;
24
+ }
25
+
26
+ /** Retorno do endpoint SearchNotifications da plataforma. */
27
+ export interface RespostaNotificacoes {
28
+ listInformation?: { totalElements: number };
29
+ [chave: string]: unknown;
30
+ }
31
+
32
+ /**
33
+ * Conexão aberta pela extensão `k6/x/sql`. Requer um binário k6 compilado com
34
+ * `xk6-sql` e o driver Postgres.
35
+ */
36
+ export interface ConexaoSql {
37
+ query(sql: string, ...args: unknown[]): Array<Record<string, unknown>>;
38
+ exec(sql: string, ...args: unknown[]): void;
39
+ close(): void;
40
+ }
41
+
42
+ /** Mapa aceito pelo `handleSummary` do k6: caminho de arquivo → conteúdo. */
43
+ export interface SaidaSummary {
44
+ [caminho: string]: string;
45
+ }
46
+
47
+ /** Opções de saída de `K6ReportUtils.gerarSummary`. */
48
+ export interface OpcoesSummary {
49
+ /** Nome do teste, usado no diretório, no nome do arquivo e no campo `teste` do JSON. */
50
+ nome?: string;
51
+ }
52
+
53
+ /** Autenticação na plataforma Senior. */
54
+ export declare class K6AuthUtils {
55
+ /** Monta os headers com `Authorization: Bearer <token>`. */
56
+ static paramsHeader(tokenId: string): ParamsHeader;
57
+
58
+ /**
59
+ * Faz login na plataforma e devolve o `access_token`.
60
+ * Registra a duração da chamada na trend `tempo_resposta_login`.
61
+ *
62
+ * @param inputLogin JSON stringificado com `{ "username": "...", "password": "..." }`.
63
+ * As credenciais vêm do repositório de teste, nunca deste core.
64
+ */
65
+ static login(inputLogin: string): Promise<string>;
66
+ }
67
+
68
+ /** Acesso a banco Postgres via extensão `k6/x/sql`. */
69
+ export declare class K6DbUtils {
70
+ /**
71
+ * Abre conexão com o Postgres.
72
+ * @param connectionString `postgres://user:pass@host:port/db`, montada pelo
73
+ * repositório de teste a partir de variáveis de ambiente.
74
+ */
75
+ static abreConexao(connectionString: string): ConexaoSql;
76
+
77
+ /** Executa um SELECT. */
78
+ static pesquisa(conexao: ConexaoSql, query: string): Array<Record<string, unknown>>;
79
+
80
+ /** Converte um único valor retornado do banco de código ASCII para string. */
81
+ static converteDado(result: Array<Record<string, unknown>>, coluna: string): string | undefined;
82
+
83
+ /** Converte um array de valores retornados do banco de código ASCII para strings. */
84
+ static converteArrayDados(results: Array<Record<string, unknown>>, coluna: string): string[];
85
+
86
+ /** Fecha a conexão. */
87
+ static fechaConexao(conexao: ConexaoSql): void;
88
+
89
+ /** Executa comando DML/DDL (UPDATE, INSERT, DELETE, DROP, etc). */
90
+ static executaComando(conexao: ConexaoSql, comando: string): void;
91
+ }
92
+
93
+ /** Geração do resumo de métricas para o `handleSummary`. */
94
+ export declare class K6ReportUtils {
95
+ /**
96
+ * Gera o resumo em JSON e o texto para o terminal.
97
+ * Destino padrão `k6/imagensIA/<nome>/k6<nome>.json`; sobrescrevível por
98
+ * `K6_JSON_DIR` e `K6_JSON_FILE`.
99
+ */
100
+ static gerarSummary(data: unknown, opcoes?: OpcoesSummary): SaidaSummary;
101
+ }
102
+
103
+ /** Helpers de array e cálculo. */
104
+ export declare class K6DataUtils {
105
+ /** Divide um array plano em lotes de `tamanho` itens. */
106
+ static criaSubArrays<T>(array: T[], tamanho: number): T[][];
107
+
108
+ /** Soma cada subarray, formatando o total com 2 casas decimais. */
109
+ static somaValores(array: number[][]): string[];
110
+ }
111
+
112
+ /** Notificações da plataforma Senior. */
113
+ export declare class K6NotificationsUtils {
114
+ /** POST em SearchNotifications, devolvendo o JSON da resposta. */
115
+ static pesquisar(
116
+ input: object | string,
117
+ params: ParamsHeader,
118
+ fullResponse?: false,
119
+ ): RespostaNotificacoes;
120
+ /** POST em SearchNotifications, devolvendo a Response completa. */
121
+ static pesquisar(
122
+ input: object | string,
123
+ params: ParamsHeader,
124
+ fullResponse: true,
125
+ ): RespostaHttp;
126
+
127
+ /**
128
+ * Faz polling até atingir `quantidadeEsperada` notificações.
129
+ * Até 100 tentativas, 4s de intervalo; falha o teste se não atingir.
130
+ */
131
+ static aguardarTotal(
132
+ input: object | string,
133
+ params: ParamsHeader,
134
+ quantidadeEsperada: number,
135
+ ): number;
136
+ }
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Declarações de tipo de `automacao-core-carga-back/playwright`.
3
+ *
4
+ * Self-contained de propósito: não re-exporta os arquivos de `src/lib/`, que não
5
+ * são publicados no pacote.
6
+ *
7
+ * Requer `@playwright/test` instalado no repositório consumidor (peer dependency).
8
+ */
9
+
10
+ import type {
11
+ FrameLocator,
12
+ Locator,
13
+ Page,
14
+ PlaywrightTestArgs,
15
+ PlaywrightTestOptions,
16
+ PlaywrightWorkerArgs,
17
+ PlaywrightWorkerOptions,
18
+ TestType,
19
+ } from '@playwright/test';
20
+
21
+ /** Credenciais do Grafana. Vêm do repositório de teste, nunca deste core. */
22
+ export interface UsuarioGrafana {
23
+ email: string;
24
+ senha: string;
25
+ }
26
+
27
+ /** Credenciais do APM Elastic. Vêm do repositório de teste, nunca deste core. */
28
+ export interface UsuarioApm {
29
+ usuario: string;
30
+ senha: string;
31
+ }
32
+
33
+ /** Opções de `ComunsUtils.aguardarAte`. */
34
+ export interface OpcoesAguardarAte {
35
+ /** Intervalo entre verificações, em ms. Padrão `100`. */
36
+ intervalo?: number;
37
+ /** Tempo máximo de espera, em ms. Padrão `10000`. */
38
+ timeout?: number;
39
+ }
40
+
41
+ /**
42
+ * Interações genéricas compartilhadas entre os specs: login APM/Grafana,
43
+ * capturas de tela e combinação de imagens.
44
+ *
45
+ * Os campos `locator*` existem em runtime mas são internos e não fazem parte da
46
+ * superfície tipada.
47
+ */
48
+ export declare class ComunsUtils {
49
+ constructor(page: Page);
50
+
51
+ page: Page;
52
+
53
+ /**
54
+ * Helpers de `automacao-core-playwright`. Tipados como `any` porque o pacote
55
+ * de origem não publica declarações de tipo.
56
+ */
57
+ dataUtils: any;
58
+ formUtils: any;
59
+ navigationUtils: any;
60
+
61
+ /** Ano corrente, capturado na construção. */
62
+ ano: number;
63
+ /** Mês corrente com 2 dígitos, capturado na construção. */
64
+ mes: string;
65
+ /** Dia corrente com 2 dígitos, capturado na construção. */
66
+ dia: string;
67
+
68
+ /**
69
+ * Aguarda N milissegundos — sempre o tempo cheio.
70
+ *
71
+ * Prefira `aguardarAte` quando houver uma condição observável.
72
+ */
73
+ delay(ms: number): Promise<void>;
74
+
75
+ /**
76
+ * Aguarda até `condicao` retornar verdadeiro, saindo assim que satisfeita.
77
+ *
78
+ * Não lança no timeout: devolve `false` para quem chamou decidir. Uma exceção
79
+ * na `condicao` conta como não satisfeita.
80
+ *
81
+ * @returns `true` se a condição foi satisfeita; `false` se estourou o timeout.
82
+ */
83
+ aguardarAte(
84
+ condicao: () => boolean | Promise<boolean>,
85
+ opcoes?: OpcoesAguardarAte,
86
+ ): Promise<boolean>;
87
+
88
+ /**
89
+ * Gera URL do APM com o intervalo de tempo atualizado, ajustando
90
+ * `rangeFrom` e `rangeTo`.
91
+ * @param data Data `DD-MM-YYYY`; se omitida usa a data atual.
92
+ */
93
+ gerarUrlApmComDataAtual(
94
+ baseUrl: string,
95
+ horarioInicial: string,
96
+ horarioFinal: string,
97
+ data?: string | null,
98
+ ): string;
99
+
100
+ /**
101
+ * Gera URL do Grafana com o intervalo de tempo atualizado, ajustando
102
+ * `from` e `to`.
103
+ * @param data Data `DD-MM-YYYY`; se omitida usa a data atual.
104
+ */
105
+ gerarUrlGrafanaComDataAtual(
106
+ baseUrl: string,
107
+ horarioInicial: string,
108
+ horarioFinal: string,
109
+ data?: string | null,
110
+ ): string;
111
+
112
+ /** Faz login no Grafana. */
113
+ loginGrafana(usuario: UsuarioGrafana): Promise<void>;
114
+
115
+ /** Faz login no APM Elastic. */
116
+ loginApm(usuario: UsuarioApm): Promise<void>;
117
+
118
+ /**
119
+ * Captura screenshot da página inteira, com 3 tentativas e criação do
120
+ * diretório de destino.
121
+ */
122
+ tirarPrintTelaInteira(nomeArquivo: string, caminhoCustomizado?: string): Promise<void>;
123
+
124
+ /** Captura screenshot de um elemento específico. */
125
+ tirarPrintLocator(
126
+ locator: Locator,
127
+ nomeArquivo: string,
128
+ caminhoCustomizado?: string,
129
+ ): Promise<void>;
130
+
131
+ /**
132
+ * Combina múltiplas screenshots numa única imagem vertical.
133
+ * @returns Caminhos das imagens individuais usadas na composição.
134
+ */
135
+ combinarPrints(
136
+ nomesImagens: string[],
137
+ nomeArquivoFinal: string,
138
+ caminhoOriginais?: string,
139
+ deletarOriginais?: boolean,
140
+ caminhoDestino?: string | null,
141
+ ): Promise<string[]>;
142
+ }
143
+
144
+ /** Navegação no APM Elastic: serviços, transactions e traces. */
145
+ export declare class ApmUtils {
146
+ constructor(page: Page);
147
+
148
+ page: Page;
149
+ comunsUtils: ComunsUtils;
150
+
151
+ /** Navega para a URL do APM e aguarda a lista de serviços carregar. */
152
+ acessaTelaApm(url: string): Promise<void>;
153
+
154
+ /** Abre os detalhes de um serviço. Faz até 3 tentativas com reload. */
155
+ acessarDetalhesServico(nomeServico: string): Promise<void>;
156
+
157
+ /**
158
+ * Abre os detalhes de uma transaction.
159
+ * @param traceExpandido `'Não'` expande o trace; `'Sim'` apenas valida o título.
160
+ */
161
+ acessarDetalhesTransactions(
162
+ nomeTransaction: string,
163
+ traceExpandido?: 'Sim' | 'Não',
164
+ ): Promise<void>;
165
+
166
+ /** Navega entre abas/seções do APM. */
167
+ navegarTelaAPM(nomeAba: string): Promise<void>;
168
+ }
169
+
170
+ /** Navegação nos painéis RabbitMQ e Kubernetes do Grafana. */
171
+ export declare class GrafanaUtils {
172
+ constructor(page: Page);
173
+
174
+ page: Page;
175
+ comunsUtils: ComunsUtils;
176
+
177
+ /** Navega para a URL do dashboard e fecha o "Dock menu" se visível. */
178
+ acessaTelaGrafana(url: string): Promise<void>;
179
+
180
+ /** Expande uma row colapsada, validando que o painel filho ficou visível. */
181
+ expandirPainel(nomePainel: string, painelExpandido: string): Promise<void>;
182
+
183
+ /** Valida que o dashboard RabbitMQ carregou com os painéis esperados. */
184
+ validarGrafanaCarregado(): Promise<void>;
185
+
186
+ /** Ordena a tabela pelo total de mensagens. */
187
+ ordenarMensagensTotal(): Promise<void>;
188
+
189
+ /** Abre a visão completa (View) de um painel, com scroll automático. */
190
+ acessarVisaoCompleta(nomeSecao: string): Promise<void>;
191
+
192
+ /** Volta ao dashboard principal. */
193
+ voltarParaDashboard(): Promise<void>;
194
+ }
195
+
196
+ /** `page` do fixture, com os page objects do core injetados. */
197
+ export interface PaginaComCore extends Page {
198
+ comunsUtils: ComunsUtils;
199
+ grafanaUtils: GrafanaUtils;
200
+ apmUtils: ApmUtils;
201
+ }
202
+
203
+ /**
204
+ * `test` do Playwright estendido com os page objects do core em `page`.
205
+ *
206
+ * Importe daqui em vez de `@playwright/test` para ter `page.comunsUtils`,
207
+ * `page.apmUtils` e `page.grafanaUtils` disponíveis.
208
+ */
209
+ export declare const test: TestType<
210
+ Omit<PlaywrightTestArgs, 'page'> & PlaywrightTestOptions & { page: PaginaComCore },
211
+ PlaywrightWorkerArgs & PlaywrightWorkerOptions
212
+ >;
213
+
214
+ export { expect } from '@playwright/test';
215
+
216
+ /**
217
+ * FrameLocator do iframe `ci`, atribuído pelo fixture quando um teste começa.
218
+ * É `undefined` até lá, por isso o tipo inclui `undefined`.
219
+ */
220
+ export declare const frame: FrameLocator | undefined;