Skip to content

Commit

Permalink
Merge 32241bb into 3dc256a
Browse files Browse the repository at this point in the history
  • Loading branch information
erikdesjardins committed Feb 15, 2017
2 parents 3dc256a + 32241bb commit e86aa1a
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 25 deletions.
28 changes: 27 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,32 @@ module.exports = function deploy(options) {
throw new Error('Failed to upload package: ' + (err.response.body.code || err.response.status));
});
})
// update the submission to intake the new package
.then(function() {
// https://docs.microsoft.com/en-us/windows/uwp/monetize/update-an-app-submission
// https://docs.microsoft.com/en-us/windows/uwp/monetize/update-a-flight-submission
return request
.put(appAndFlight + '/submissions/' + submissionInfo.id)
.set('Authorization', 'Bearer ' + accessToken)
.send(Object.assign({}, submissionInfo, {
[flightId ? 'flightPackages' : 'applicationPackages']: [{
fileName: 'package.appx',
fileStatus: 'PendingUpload',
minimumDirectXVersion: 'None',
minimumSystemRam: 'None'
}].concat(submissionInfo[flightId ? 'flightPackages' : 'applicationPackages'].map(function(pack) {
// remove old packages
return Object.assign({}, pack, {
fileStatus: 'PendingDelete'
});
}))
}))
.then(function(response) {
submissionInfo = response.body;
}, function(err) {
throw new Error('Failed to update submission: ' + (err.response.body.code || err.response.status));
});
})
// commit new submission
.then(function() {
// https://docs.microsoft.com/en-us/windows/uwp/monetize/commit-an-app-submission
Expand All @@ -153,7 +179,7 @@ module.exports = function deploy(options) {
.then(function(response) {
// https://github.com/Microsoft/StoreBroker/blob/master/Documentation/USAGE.md#status-progression
var status = response.body.status;
if (status === 'CommitStarted') {
if (status === 'PendingCommit' || status === 'CommitStarted') {
// try again
return sleep(30000).then(poll);
} else if (
Expand Down
126 changes: 102 additions & 24 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,8 @@ test.serial('failing commit', async t => {
t.context.responses = [
{ access_token: 'q' },
{},
{ fileUploadUrl: 'https://mockfileupload.url' },
{ fileUploadUrl: 'https://mockfileupload.url', applicationPackages: [] },
{},
{},
new ResponseError({ code: 'errorCode' }),
];
Expand All @@ -227,14 +228,15 @@ test.serial('failing commit', async t => {
'Failed to commit submission: errorCode',
);

t.is(t.context.requests.length, 5);
t.is(t.context.requests.length, 6);
});

test.serial('failing completion', async t => {
t.context.responses = [
{ access_token: 'q' },
{},
{ fileUploadUrl: 'https://mockfileupload.url' },
{ fileUploadUrl: 'https://mockfileupload.url', applicationPackages: [] },
{},
{},
{},
new ResponseError({ code: 'errorCode' }),
Expand All @@ -245,14 +247,15 @@ test.serial('failing completion', async t => {
'Failed to poll for commit status: errorCode',
);

t.is(t.context.requests.length, 6);
t.is(t.context.requests.length, 7);
});

test.serial('bad commit status', async t => {
t.context.responses = [
{ access_token: 'q' },
{},
{ fileUploadUrl: 'https://mockfileupload.url' },
{ fileUploadUrl: 'https://mockfileupload.url', applicationPackages: [] },
{},
{},
{},
{ status: 'CommitFailed', statusDetails: 'statusDetails' }
Expand All @@ -263,14 +266,15 @@ test.serial('bad commit status', async t => {
'Failed: CommitFailed "statusDetails"',
);

t.is(t.context.requests.length, 6);
t.is(t.context.requests.length, 7);
});

test.serial('bad commit status after polling', async t => {
t.context.responses = [
{ access_token: 'q' },
{},
{ fileUploadUrl: 'https://mockfileupload.url' },
{ fileUploadUrl: 'https://mockfileupload.url', applicationPackages: [] },
{},
{},
{},
{ status: 'CommitStarted' },
Expand All @@ -282,15 +286,36 @@ test.serial('bad commit status after polling', async t => {
'Failed: CommitFailed "statusDetails"',
);

t.is(t.context.requests.length, 7);
t.is(t.context.requests.length, 8);
});

test.serial('bad commit status after polling 2', async t => {
t.context.responses = [
{ access_token: 'q' },
{},
{ fileUploadUrl: 'https://mockfileupload.url', applicationPackages: [] },
{},
{},
{},
{ status: 'PendingCommit' },
{ status: 'CommitFailed', statusDetails: 'statusDetails' }
];

await t.throws(
deploy({ tenantId: 'q', clientId: 'q', clientSecret: 'q', appId: 'q', appx: new EmptyStream() }),
'Failed: CommitFailed "statusDetails"',
);

t.is(t.context.requests.length, 8);
});

test.serial('full publish, no pending submission', async t => {
t.context.responses = [
{ access_token: 'myAccessToken' },
{},
{ fileUploadUrl: 'https://mockfileupload.url', id: 'mySubmissionId' },
{ fileUploadUrl: 'https://mockfileupload.url', id: 'mySubmissionId', applicationPackages: [{ fileName: 'foo', fileStatus: 'Uploaded' }] },
{},
{ id: 'thisIdWontActuallyChangeInPractice' },
{},
{ status: 'PreProcessing' }
];
Expand All @@ -312,20 +337,34 @@ test.serial('full publish, no pending submission', async t => {
t.is(r[3].headers['x-ms-blob-type'], 'BlockBlob');
t.true(r[3].params instanceof Buffer);

t.deepEqual(r[4].match, ['myAppId', undefined, '/submissions/mySubmissionId/commit']);
t.deepEqual(r[4].match, ['myAppId', undefined, '/submissions/mySubmissionId']);
t.is(r[4].headers.Authorization, 'Bearer myAccessToken');

t.deepEqual(r[5].match, ['myAppId', undefined, '/submissions/mySubmissionId/status']);
t.deepEqual(r[4].params, {
applicationPackages: [
{ fileName: 'package.appx', fileStatus: 'PendingUpload', minimumDirectXVersion: 'None', minimumSystemRam: 'None' },
{ fileName: 'foo', fileStatus: 'PendingDelete' }
],
fileUploadUrl: 'https://mockfileupload.url',
id: 'mySubmissionId'
});

t.deepEqual(r[5].match, ['myAppId', undefined, '/submissions/thisIdWontActuallyChangeInPractice/commit']);
t.is(r[5].headers.Authorization, 'Bearer myAccessToken');

t.deepEqual(r[6].match, ['myAppId', undefined, '/submissions/thisIdWontActuallyChangeInPractice/status']);
t.is(r[6].headers.Authorization, 'Bearer myAccessToken');

t.is(t.context.requests.length, 7);
});

test.serial('full publish, with pending submission', async t => {
t.context.responses = [
{ access_token: 'myAccessToken' },
{ pendingApplicationSubmission: { id: 'mySubmissionCode' } },
{},
{ fileUploadUrl: 'https://mockfileupload.url', id: 'mySubmissionId' },
{ fileUploadUrl: 'https://mockfileupload.url', id: 'mySubmissionId', applicationPackages: [{ fileName: 'foo', fileStatus: 'Uploaded' }] },
{},
{ id: 'thisIdWontActuallyChangeInPractice' },
{},
{ status: 'PreProcessing' }
];
Expand All @@ -350,19 +389,33 @@ test.serial('full publish, with pending submission', async t => {
t.is(r[4].headers['x-ms-blob-type'], 'BlockBlob');
t.true(r[4].params instanceof Buffer);

t.deepEqual(r[5].match, ['myAppId', undefined, '/submissions/mySubmissionId/commit']);
t.deepEqual(r[5].match, ['myAppId', undefined, '/submissions/mySubmissionId']);
t.is(r[5].headers.Authorization, 'Bearer myAccessToken');

t.deepEqual(r[6].match, ['myAppId', undefined, '/submissions/mySubmissionId/status']);
t.deepEqual(r[5].params, {
applicationPackages: [
{ fileName: 'package.appx', fileStatus: 'PendingUpload', minimumDirectXVersion: 'None', minimumSystemRam: 'None' },
{ fileName: 'foo', fileStatus: 'PendingDelete' }
],
fileUploadUrl: 'https://mockfileupload.url',
id: 'mySubmissionId'
});

t.deepEqual(r[6].match, ['myAppId', undefined, '/submissions/thisIdWontActuallyChangeInPractice/commit']);
t.is(r[6].headers.Authorization, 'Bearer myAccessToken');

t.deepEqual(r[7].match, ['myAppId', undefined, '/submissions/thisIdWontActuallyChangeInPractice/status']);
t.is(r[7].headers.Authorization, 'Bearer myAccessToken');

t.is(t.context.requests.length, 8);
});

test.serial('full publish to flight, no pending submission', async t => {
t.context.responses = [
{ access_token: 'myAccessToken' },
{},
{ fileUploadUrl: 'https://mockfileupload.url', id: 'mySubmissionId' },
{ fileUploadUrl: 'https://mockfileupload.url', id: 'mySubmissionId', flightPackages: [{ fileName: 'foo', fileStatus: 'Uploaded' }] },
{},
{ id: 'thisIdWontActuallyChangeInPractice' },
{},
{ status: 'PreProcessing' }
];
Expand All @@ -384,20 +437,34 @@ test.serial('full publish to flight, no pending submission', async t => {
t.is(r[3].headers['x-ms-blob-type'], 'BlockBlob');
t.true(r[3].params instanceof Buffer);

t.deepEqual(r[4].match, ['myAppId', 'myFlightId', '/submissions/mySubmissionId/commit']);
t.deepEqual(r[4].match, ['myAppId', 'myFlightId', '/submissions/mySubmissionId']);
t.is(r[4].headers.Authorization, 'Bearer myAccessToken');

t.deepEqual(r[5].match, ['myAppId', 'myFlightId', '/submissions/mySubmissionId/status']);
t.deepEqual(r[4].params, {
flightPackages: [
{ fileName: 'package.appx', fileStatus: 'PendingUpload', minimumDirectXVersion: 'None', minimumSystemRam: 'None' },
{ fileName: 'foo', fileStatus: 'PendingDelete' }
],
fileUploadUrl: 'https://mockfileupload.url',
id: 'mySubmissionId'
});

t.deepEqual(r[5].match, ['myAppId', 'myFlightId', '/submissions/thisIdWontActuallyChangeInPractice/commit']);
t.is(r[5].headers.Authorization, 'Bearer myAccessToken');

t.deepEqual(r[6].match, ['myAppId', 'myFlightId', '/submissions/thisIdWontActuallyChangeInPractice/status']);
t.is(r[6].headers.Authorization, 'Bearer myAccessToken');

t.is(t.context.requests.length, 7);
});

test.serial('full publish to flight, with pending submission', async t => {
t.context.responses = [
{ access_token: 'myAccessToken' },
{ pendingFlightSubmission: { id: 'mySubmissionCode' } },
{},
{ fileUploadUrl: 'https://mockfileupload.url', id: 'mySubmissionId' },
{ fileUploadUrl: 'https://mockfileupload.url', id: 'mySubmissionId', flightPackages: [{ fileName: 'foo', fileStatus: 'Uploaded' }] },
{},
{ id: 'thisIdWontActuallyChangeInPractice' },
{},
{ status: 'PreProcessing' }
];
Expand All @@ -422,9 +489,20 @@ test.serial('full publish to flight, with pending submission', async t => {
t.is(r[4].headers['x-ms-blob-type'], 'BlockBlob');
t.true(r[4].params instanceof Buffer);

t.deepEqual(r[5].match, ['myAppId', 'myFlightId', '/submissions/mySubmissionId/commit']);
t.deepEqual(r[5].match, ['myAppId', 'myFlightId', '/submissions/mySubmissionId']);
t.is(r[5].headers.Authorization, 'Bearer myAccessToken');

t.deepEqual(r[6].match, ['myAppId', 'myFlightId', '/submissions/mySubmissionId/status']);
t.deepEqual(r[5].params, {
flightPackages: [
{ fileName: 'package.appx', fileStatus: 'PendingUpload', minimumDirectXVersion: 'None', minimumSystemRam: 'None' },
{ fileName: 'foo', fileStatus: 'PendingDelete' }
],
fileUploadUrl: 'https://mockfileupload.url',
id: 'mySubmissionId'
});

t.deepEqual(r[6].match, ['myAppId', 'myFlightId', '/submissions/thisIdWontActuallyChangeInPractice/commit']);
t.is(r[6].headers.Authorization, 'Bearer myAccessToken');

t.deepEqual(r[7].match, ['myAppId', 'myFlightId', '/submissions/thisIdWontActuallyChangeInPractice/status']);
t.is(r[7].headers.Authorization, 'Bearer myAccessToken');
});

0 comments on commit e86aa1a

Please sign in to comment.