Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import type { PathLike } from 'node:fs';
import fs from 'node:fs';
import { beforeEach, describe, expect, test, vi } from 'vitest';
import { getInstallOutputFileName } from '../findOutputFile.js';

function mockExistingFiles(buildDirectory: string, buildFileName: string) {
const existingFilesPaths = [
`${buildDirectory}/${buildFileName}`,
buildDirectory,
];

vi.mocked(fs.existsSync).mockImplementation((file: PathLike) =>
existingFilesPaths.includes(file.toString()),
);
}

beforeEach(() => {
vi.resetAllMocks();
});

describe('getInstallOutputFileName', () => {
const variant = 'debug';
const apkOrAab = 'apk';

test('returns CPU-specific file', async () => {
const appName = 'app';
const buildDirectory = 'android/app/build/outputs/apk/debug';
const buildFileNameOutput = 'app-universal-debug.apk';
mockExistingFiles(buildDirectory, buildFileNameOutput);

const result = await getInstallOutputFileName(
appName,
variant,
buildDirectory,
apkOrAab,
undefined,
);

expect(result).toBe(buildFileNameOutput);
});

test('returns build file if appName is provided', async () => {
const appName = 'app';
const buildDirectory = 'android/app/build/outputs/apk/debug';
const buildFileNameOutput = 'app-debug.apk';
mockExistingFiles(buildDirectory, buildFileNameOutput);

const result = await getInstallOutputFileName(
appName,
variant,
buildDirectory,
apkOrAab,
undefined,
);

expect(result).toBe(buildFileNameOutput);
});

test('returns build file if appName is missing', async () => {
const appName = '';
const buildDirectory = 'Android/build/outputs/apk/debug';
const buildFileNameOutput = 'HybridApp-debug.apk';
mockExistingFiles(buildDirectory, buildFileNameOutput);
vi.mocked(fs.readdirSync).mockReturnValueOnce([buildFileNameOutput as any]);

Check warning on line 64 in packages/platform-android/src/lib/commands/runAndroid/__tests__/getInstallOutputFileName.test.ts

View workflow job for this annotation

GitHub Actions / Validate

Unexpected any. Specify a different type

const result = await getInstallOutputFileName(
appName,
variant,
buildDirectory,
apkOrAab,
undefined,
);

expect(result).toBe(buildFileNameOutput);
});
});
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { existsSync } from 'node:fs';
import { existsSync, readdirSync } from 'node:fs';
import { logger, spawn } from '@rock-js/tools';
import { getAdbPath } from './adb.js';
import type { AndroidProject } from './runAndroid.js';
Expand Down Expand Up @@ -41,7 +41,7 @@ export async function findOutputFile(
return outputFile ? `${buildDirectory}/${outputFile}` : undefined;
}

async function getInstallOutputFileName(
export async function getInstallOutputFileName(
appName: string,
variant: string,
buildDirectory: string,
Expand All @@ -64,6 +64,16 @@ async function getInstallOutputFileName(
return outputFile;
}

// check if there is a file like -debug.apk (missing app name)
if (existsSync(buildDirectory)) {
const pattern = `-${variant}.${apkOrAab}`;
const files = readdirSync(buildDirectory);
const matchingFile = files?.find((file) => file.endsWith(pattern));
if (matchingFile) {
return matchingFile;
}
}

logger.debug('Could not find the output file:', {
buildDirectory,
outputFile,
Expand Down
Loading