1 Commits

Author SHA1 Message Date
mono
a21c43684c test: verificar apk y flujos beta 2026-10-25 20:23:13 -05:00
11 changed files with 55 additions and 12 deletions

View File

@@ -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.

View File

@@ -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",

View File

@@ -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",

View File

@@ -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', () => {

View File

@@ -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();
});

View File

@@ -1,2 +1,2 @@
versionName=0.0.4 versionName=0.0.5
versionCode=4 versionCode=5

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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
View 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"