playup-with-internal
Version:
Publish APKs to Google Play Store
272 lines (244 loc) • 8.04 kB
JavaScript
var test = require('tape')
var proxyquire = require('proxyquire')
var sinon = require('sinon')
var Upload = require('../lib/upload')
var defaultClient = {}
var defaultApk = '/path/to/apk'
var defaultPackage = 'com.jeduan.test'
test('Upload should create with default options', function (t) {
var up = new Upload(defaultClient, defaultApk)
t.equals(up.client, defaultClient, 'Sets client correctly')
t.deepEquals(up.apk, [defaultApk], 'Sets apk correctly')
t.equals(up.track, 'alpha', 'Sets track correctly')
t.equals(up.obbs.length, 0, 'Sets obbs correctly')
t.equals(Object.keys(up.recentChanges).length, 0, 'Sets recent changes correctly')
t.end()
})
test('Upload should assign package name from apk parser', function (t) {
var readManifestSync = sinon.stub().returns({
package: defaultPackage,
versionCode: 1
})
var readFile = sinon.stub().returns({
readManifestSync: readManifestSync
})
var Upload = proxyquire('../lib/upload', {
'node-apk-parser': {readFile: readFile}
})
var up = new Upload(defaultClient, defaultApk)
up.parseManifest()
.then(function () {
t.equals(up.packageName, defaultPackage, 'Sets package name correctly')
t.equals(up.versionCode, 1, 'Sets version code correctly')
t.end()
})
.catch(function (err) {
console.error(err)
t.ok(false, 'This should not happen')
t.end()
})
})
test('Upload should catch errors in apk parser', function (t) {
var readFile = sinon.stub().throws()
var Upload = proxyquire('../lib/upload', {
'node-apk-parser': {readFile: readFile}
})
var up = new Upload(defaultClient, defaultApk)
up.parseManifest()
.catch(function (err) {
t.ok(err instanceof Error, 'Thrown an error')
t.end()
})
})
test('Should authenticate', function (t) {
var spy = sinon.spy()
var Upload = require('../lib/upload')
var client = {authorize: spy}
var up = new Upload(client, defaultApk)
up.authenticate().then(onAuthenticate)
t.equal(spy.callCount, 1, 'Authenticate is called')
t.equal(typeof spy.firstCall.args[0], 'function')
spy.firstCall.args[0]()
function onAuthenticate () {
t.end()
}
})
test('Upload should set editId correctly', function (t) {
var spy = sinon.spy()
var androidpublisher = sinon.stub().returns({
edits: {
insert: spy
}
})
var Upload = proxyquire('../lib/upload', {
'googleapis': {androidpublisher: androidpublisher}
})
var up = new Upload(defaultClient, defaultApk)
up.packageName = defaultPackage
up.createEdit().then(onEdit)
var callParams = spy.firstCall.args[0]
t.equal(typeof callParams, 'object')
t.equal(callParams.packageName, defaultPackage)
t.equal(callParams.auth, defaultClient)
t.equal(typeof spy.firstCall.args[1], 'function')
spy.firstCall.args[1](null, {id: 123})
function onEdit () {
t.equals(up.editId, 123, 'Sets up editId correctly')
t.end()
}
})
test('Upload should send the apk', function (t) {
var spy = sinon.spy()
var readStream = sinon.spy()
var androidpublisher = sinon.stub().returns({
edits: {
apks: {
upload: spy
}
}
})
var Upload = proxyquire('../lib/upload', {
'googleapis': {androidpublisher: androidpublisher},
'fs': {createReadStream: readStream}
})
var up = new Upload(defaultClient, defaultApk)
up.packageName = defaultPackage
up.editId = 123
up.uploadAPK().then(onUpload)
var callParams = spy.firstCall.args[0]
t.equal(typeof callParams, 'object')
t.equal(callParams.packageName, defaultPackage, 'Sets default package')
t.equal(callParams.editId, 123, 'Sets editId')
t.equal(callParams.auth, defaultClient)
t.equal(callParams.media.mimeType, 'application/vnd.android.package-archive', 'Sets MIME type')
t.equal(readStream.firstCall.args[0], defaultApk, 'Sends the APK')
t.equal(typeof spy.firstCall.args[1], 'function')
spy.firstCall.args[1](null, {version: 1, binary: {sha1: ''}})
function onUpload () {
t.end()
}
})
test('Should resolve a promise when there are no OBBs', function (t) {
var Upload = require('../lib/upload')
var up = new Upload(defaultClient, defaultApk)
up.uploadOBBs().then(function () {
t.end()
})
})
test('Should upload every OBB', function (t) {
var spy = sinon.spy()
var readStream = sinon.spy()
var androidpublisher = sinon.stub().returns({
edits: {
expansionfiles: {
upload: spy
}
}
})
var Upload = proxyquire('../lib/upload', {
'googleapis': {androidpublisher: androidpublisher},
'fs': {createReadStream: readStream}
})
var obbs = ['obb1', 'obb2', 'obb3']
var up = new Upload(defaultClient, defaultApk)
up.packageName = defaultPackage
up.editId = 123
up.versionCode = 1
up.obbs = obbs
up.uploadOBBs().then(function () {
t.end()
})
t.equal(typeof spy.firstCall.args[0], 'object')
t.equal(readStream.firstCall.args[0], obbs[0], 'First OBB uploaded')
t.equal(typeof spy.firstCall.args[1], 'function')
spy.firstCall.args[1]()
t.equal(readStream.secondCall.args[0], obbs[1], 'Second OBB uploaded')
t.equal(typeof spy.secondCall.args[1], 'function')
spy.secondCall.args[1]()
t.equal(readStream.thirdCall.args[0], obbs[2], 'Third OBB uploaded')
t.equal(typeof spy.thirdCall.args[1], 'function')
spy.thirdCall.args[1]()
})
test('Should default to alpha track', function (t) {
var spy = sinon.spy()
var androidpublisher = sinon.stub().returns({
edits: {
tracks: {
update: spy
}
}
})
var Upload = proxyquire('../lib/upload', {
'googleapis': {androidpublisher: androidpublisher}
})
var up = new Upload(defaultClient, defaultApk)
up.assignTrack().then(function () {
t.end()
})
var args = spy.firstCall.args
t.equals(args[0].track, 'alpha')
t.equals(typeof args[1], 'function')
args[1](null, {track: 'alpha'})
})
test('Should upload recent changes', function (t) {
var spy = sinon.spy()
var androidpublisher = sinon.stub().returns({
edits: {
apklistings: {
update: spy
}
}
})
var Upload = proxyquire('../lib/upload', {
'googleapis': {androidpublisher: androidpublisher}
})
var changes = {
'en-US': 'lorem',
'es-MX': 'ipsum',
'jp': 'dolor'
}
var up = new Upload(defaultClient, defaultApk)
up.packageName = defaultPackage
up.editId = 123
up.versionCode = 1
up.recentChanges = changes
up.sendRecentChanges().then(function () {
t.end()
})
t.equal(typeof spy.firstCall.args[0], 'object')
t.equal(spy.firstCall.args[0].language, 'en-US', 'Sets language')
t.equal(spy.firstCall.args[0].resource.recentChanges, 'lorem', 'Sets language')
t.equal(typeof spy.firstCall.args[1], 'function')
spy.firstCall.args[1]()
t.equal(typeof spy.secondCall.args[1], 'function')
t.equal(spy.secondCall.args[0].language, 'es-MX', 'Sets language')
t.equal(spy.secondCall.args[0].resource.recentChanges, 'ipsum', 'Sets language')
spy.secondCall.args[1]()
t.equal(typeof spy.thirdCall.args[1], 'function')
t.equal(spy.thirdCall.args[0].language, 'jp', 'Sets language')
t.equal(spy.thirdCall.args[0].resource.recentChanges, 'dolor', 'Sets language')
spy.thirdCall.args[1]()
})
test('Should commit changes', function (t) {
var spy = sinon.spy()
var androidpublisher = sinon.stub().returns({
edits: {
commit: spy
}
})
var Upload = proxyquire('../lib/upload', {
'googleapis': {androidpublisher: androidpublisher}
})
var up = new Upload(defaultClient, defaultApk)
up.packageName = defaultPackage
up.editId = 123
up.commitChanges().then(function () {
t.end()
})
t.equal(spy.callCount, 1, 'Called one time')
t.equal(spy.firstCall.args[0].editId, 123, 'Sets the edit id')
t.equal(spy.firstCall.args[0].packageName, defaultPackage, 'Sets the package name')
t.equal(spy.firstCall.args[0].auth, defaultClient, 'Sets the package name')
t.assert(typeof spy.firstCall.args[1] === 'function', 'Receives a callback')
spy.firstCall.args[1]()
})