test: verificar apk y flujos beta
This commit is contained in:
@@ -25,3 +25,11 @@ Skills del proyecto en `skills/`:
|
|||||||
Seguir OpenSpec workflow: propose -> apply -> archive
|
Seguir OpenSpec workflow: propose -> apply -> archive
|
||||||
Usar skills cuando aplique al contexto
|
Usar skills cuando aplique al contexto
|
||||||
Mantener código siguiendo arquitectura limpia
|
Mantener código siguiendo arquitectura limpia
|
||||||
|
|
||||||
|
## Release Android
|
||||||
|
- Antes de publicar una APK, ejecutar `npm run test:run`, `npm run test:e2e`, `npm exec vue-tsc -- --noEmit` y `npm run build`.
|
||||||
|
- Ejecutar `npx cap sync android` y `./gradlew assembleDebug` usando el builder Android del repositorio cuando el host no tenga Java.
|
||||||
|
- Verificar el APK con `scripts/verify-apk.sh <apk> <versionName> <versionCode>` antes de adjuntarlo a Gitea.
|
||||||
|
- El script debe confirmar `applicationId`, `versionName`, `versionCode`, bundle JavaScript, fuentes MDI y textos críticos de la versión.
|
||||||
|
- Incrementar `versionCode` para cada APK publicable; mantener la misma firma y publicar versiones beta como prerelease.
|
||||||
|
- Después de subir un asset, comparar su SHA256 con el APK verificado localmente y comprobar el asset de la release mediante la API de Gitea.
|
||||||
|
|||||||
4
apps/toldo-app/package-lock.json
generated
4
apps/toldo-app/package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "toldo-app",
|
"name": "toldo-app",
|
||||||
"version": "0.0.4",
|
"version": "0.0.5",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "toldo-app",
|
"name": "toldo-app",
|
||||||
"version": "0.0.4",
|
"version": "0.0.5",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@capacitor/android": "^6.2.1",
|
"@capacitor/android": "^6.2.1",
|
||||||
"@capacitor/core": "^6.2.1",
|
"@capacitor/core": "^6.2.1",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "toldo-app",
|
"name": "toldo-app",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.0.4",
|
"version": "0.0.5",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ describe('contratos de operación y respaldo', () => {
|
|||||||
|
|
||||||
it('expone la versión actual en las exportaciones', () => {
|
it('expone la versión actual en las exportaciones', () => {
|
||||||
const result = new ExportImportService().exportAll({ productores: [], productos: [], movimientosInventario: [], ventas: [], ventaLineas: [], gastos: [], ajustes: [], cuadres: [] });
|
const result = new ExportImportService().exportAll({ productores: [], productos: [], movimientosInventario: [], ventas: [], ventaLineas: [], gastos: [], ajustes: [], cuadres: [] });
|
||||||
expect(result.appVersion).toBe('0.0.4');
|
expect(result.appVersion).toBe('0.0.5');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('exporta jornadas junto con los datos operativos', () => {
|
it('exporta jornadas junto con los datos operativos', () => {
|
||||||
|
|||||||
@@ -29,3 +29,18 @@ test('permite volver a inicio desde Jornada e Inventario', async ({ page }) => {
|
|||||||
await page.getByTestId('back-button').click();
|
await page.getByTestId('back-button').click();
|
||||||
await expect(page.getByText('Panel de control')).toBeVisible();
|
await expect(page.getByText('Panel de control')).toBeVisible();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('muestra los flujos compactos en móvil', async ({ page }) => {
|
||||||
|
test.skip(test.info().project.name !== 'mobile', 'Este escenario se ejecuta en el proyecto móvil.');
|
||||||
|
await page.setViewportSize({ width: 390, height: 844 });
|
||||||
|
await page.goto('/inventario');
|
||||||
|
await expect(page.getByRole('tab', { name: 'Catálogo' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('tab', { name: 'Ingresos' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('tab', { name: 'Ajustes' })).toBeVisible();
|
||||||
|
await expect(page.getByText('Migas de pan')).toHaveCount(0);
|
||||||
|
await page.goto('/ventas');
|
||||||
|
await expect(page.getByRole('button', { name: 'Buscar productos' })).toBeVisible();
|
||||||
|
await page.goto('/jornada');
|
||||||
|
await expect(page.getByLabel('Efectivo contado (obligatorio)')).toBeVisible();
|
||||||
|
await expect(page.getByLabel('Dinero en banco por QR (opcional)')).toBeVisible();
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
versionName=0.0.4
|
versionName=0.0.5
|
||||||
versionCode=4
|
versionCode=5
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ La aplicación usa versiones distintas o hardcodeadas entre npm, Android y las e
|
|||||||
|
|
||||||
- Definir `versionName` y `versionCode` en un archivo versionado compartido.
|
- Definir `versionName` y `versionCode` en un archivo versionado compartido.
|
||||||
- Usar esos valores en Gradle, npm y exportaciones JSON.
|
- Usar esos valores en Gradle, npm y exportaciones JSON.
|
||||||
- Publicar la siguiente versión como `0.0.4` con `versionCode 4`.
|
- Publicar la siguiente versión como `0.0.5` con `versionCode 5`.
|
||||||
- Validar el `applicationId` y la versión en el APK generado.
|
- Validar el `applicationId` y la versión en el APK generado.
|
||||||
|
|
||||||
## Capabilities
|
## Capabilities
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ Asegura que cada actualización de ToldoConjunto pueda identificarse y actualiza
|
|||||||
### Requirement: Versionado consistente
|
### Requirement: Versionado consistente
|
||||||
The system SHALL expose the same semantic version in npm metadata, exported data, and Android versionName.
|
The system SHALL expose the same semantic version in npm metadata, exported data, and Android versionName.
|
||||||
|
|
||||||
#### Scenario: Version 0.0.4
|
#### Scenario: Version 0.0.5
|
||||||
- **WHEN** the app is built
|
- **WHEN** the app is built
|
||||||
- **THEN** npm and exported data report `0.0.4`
|
- **THEN** npm and exported data report `0.0.5`
|
||||||
- **AND** Android reports versionName `0.0.4` and versionCode `4`
|
- **AND** Android reports versionName `0.0.5` and versionCode `5`
|
||||||
|
|
||||||
### Requirement: Identidad Android estable
|
### Requirement: Identidad Android estable
|
||||||
The system SHALL preserve the application id `com.ilusion.toldoconjunto` across releases.
|
The system SHALL preserve the application id `com.ilusion.toldoconjunto` across releases.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## 1. Versionado
|
## 1. Versionado
|
||||||
|
|
||||||
- [x] 1.1 Crear la fuente compartida con `versionName=0.0.4` y `versionCode=4`, y actualizar npm/exportaciones
|
- [x] 1.1 Crear la fuente compartida con `versionName=0.0.5` y `versionCode=5`, y actualizar npm/exportaciones
|
||||||
- [x] 1.2 Configurar Gradle para leer la fuente compartida y conservar el applicationId
|
- [x] 1.2 Configurar Gradle para leer la fuente compartida y conservar el applicationId
|
||||||
- [x] 1.3 Añadir test que compruebe versionado y compatibilidad de exportación
|
- [x] 1.3 Añadir test que compruebe versionado y compatibilidad de exportación
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export interface ExportData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const CURRENT_SCHEMA_VERSION = 1;
|
export const CURRENT_SCHEMA_VERSION = 1;
|
||||||
export const APP_VERSION = '0.0.4';
|
export const APP_VERSION = '0.0.5';
|
||||||
|
|
||||||
export class ExportImportService {
|
export class ExportImportService {
|
||||||
exportAll(data: ExportData['data']): ExportData {
|
exportAll(data: ExportData['data']): ExportData {
|
||||||
|
|||||||
20
scripts/verify-apk.sh
Executable file
20
scripts/verify-apk.sh
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
apk="${1:?Uso: verify-apk.sh <apk> <versionName> <versionCode>}"
|
||||||
|
version_name="${2:?Falta versionName}"
|
||||||
|
version_code="${3:?Falta versionCode}"
|
||||||
|
aapt_bin="${AAPT:-aapt2}"
|
||||||
|
tmp_dir="$(mktemp -d)"
|
||||||
|
trap 'rm -rf "$tmp_dir"' EXIT
|
||||||
|
|
||||||
|
badging="$($aapt_bin dump badging "$apk")"
|
||||||
|
printf '%s\n' "$badging" | grep -F "package: name='com.ilusion.toldoconjunto' versionCode='$version_code' versionName='$version_name'" >/dev/null
|
||||||
|
|
||||||
|
unzip -q "$apk" -d "$tmp_dir"
|
||||||
|
find "$tmp_dir/assets/public/assets" -type f -name '*.js' -print0 | xargs -0 grep -F -l 'Buscar productos' >/dev/null
|
||||||
|
find "$tmp_dir/assets/public/assets" -type f -name '*.js' -print0 | xargs -0 grep -F -l 'Dinero en banco por QR' >/dev/null
|
||||||
|
find "$tmp_dir/assets/public/assets" -type f -name '*.js' -print0 | xargs -0 grep -F -l 'Cerrar caja y jornada' >/dev/null
|
||||||
|
find "$tmp_dir/assets/public/assets" -type f -name '*.woff2' | grep materialdesignicons >/dev/null
|
||||||
|
|
||||||
|
printf 'APK verificada: applicationId=com.ilusion.toldoconjunto versionName=%s versionCode=%s\n' "$version_name" "$version_code"
|
||||||
Reference in New Issue
Block a user