feat: add listTarget api (#1602)

* feat: add listTarget api
* test: write Platform API target list specs
This commit is contained in:
エリス 2023-05-08 22:27:17 +09:00 committed by GitHub
parent cb48147398
commit 7da13ccf77
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 97 additions and 0 deletions

View File

@ -277,6 +277,12 @@ class Api {
});
}
listTargets (options) {
return require('./check_reqs').check_android().then(() => {
return require('./run').runListDevices.call(this, options);
});
}
/**
* Cleans out the build artifacts from platform's directory, and also
* cleans out the platform www directory if called without options specified.

View File

@ -83,3 +83,49 @@ module.exports.run = async function (runOptions = {}) {
return target.install(resolvedTarget, { manifest, buildResults, cordovaGradleConfigParser });
};
module.exports.listDevices = async function () {
events.emit('log', `\nAvailable ${this.platform} devices:`);
const { list } = require('./target');
await list().then(targets => {
const deviceIds = targets
.filter(({ type }) => type === 'device')
.map(({ id }) => id);
console.log(deviceIds.join('\n'));
}, function (err) {
console.error('ERROR: ' + err);
process.exit(2);
});
};
module.exports.listEmulators = async function () {
events.emit('log', `\nAvailable ${this.platform} virtual devices:`);
const emulators = require('./emulator');
await emulators.list_images().then(function (emulator_list) {
emulator_list && emulator_list.forEach(function (emu) {
console.log(emu.name);
});
}, function (err) {
console.error('ERROR: ' + err);
process.exit(2);
});
};
module.exports.runListDevices = async function (options = {}) {
const { options: cliArgs = {} } = options;
if (cliArgs?.device) {
await module.exports.listDevices.call(this);
} else if (cliArgs?.emulator) {
await module.exports.listEmulators.call(this);
} else {
await module.exports.listDevices.call(this);
await module.exports.listEmulators.call(this);
}
return true;
};

View File

@ -24,6 +24,8 @@ const EventEmitter = require('events');
const Api = require('../../lib/Api');
const AndroidProject = require('../../lib/AndroidProject');
const check_reqs = require('../../lib/check_reqs');
const run_mod = require('../../lib/run');
const PluginInfo = common.PluginInfo;
@ -60,4 +62,19 @@ describe('Api', () => {
});
});
});
describe('listTargets', () => {
let api;
beforeEach(() => {
api = new Api('android', FAKE_PROJECT_DIR, new EventEmitter());
spyOn(check_reqs, 'run').and.returnValue(Promise.resolve());
});
it('should call into lib/run module', () => {
spyOn(run_mod, 'runListDevices');
return api.listTargets().then(() => {
expect(run_mod.runListDevices).toHaveBeenCalled();
});
});
});
});

View File

@ -106,4 +106,32 @@ describe('run', () => {
.toBeRejectedWithError(/Package type "bundle" is not supported/);
});
});
describe('--list option', () => {
beforeEach(() => {
spyOn(run, 'listDevices').and.returnValue(Promise.resolve());
spyOn(run, 'listEmulators').and.returnValue(Promise.resolve());
});
it('should delegate to "listDevices" when the "runListDevices" method options param contains "options.device".', () => {
return run.runListDevices({ options: { device: true } }).then(() => {
expect(run.listDevices).toHaveBeenCalled();
expect(run.listEmulators).not.toHaveBeenCalled();
});
});
it('should delegate to "listDevices" when the "runListDevices" method options param contains "options.emulator".', () => {
return run.runListDevices({ options: { emulator: true } }).then(() => {
expect(run.listDevices).not.toHaveBeenCalled();
expect(run.listEmulators).toHaveBeenCalled();
});
});
it('should delegate to both "listEmulators" and "listDevices" when the "runListDevices" method does not contain "options.device" or "options.emulator".', () => {
return run.runListDevices({ options: {} }).then(() => {
expect(run.listDevices).toHaveBeenCalled();
expect(run.listEmulators).toHaveBeenCalled();
});
});
});
});