250 lines
6.3 KiB
JavaScript
250 lines
6.3 KiB
JavaScript
const request = require('request');
|
|
|
|
function createProduct() {
|
|
const file = new Parse.File(
|
|
'name',
|
|
{
|
|
base64: new Buffer('download_file', 'utf-8').toString('base64'),
|
|
},
|
|
'text'
|
|
);
|
|
return file.save().then(function() {
|
|
const product = new Parse.Object('_Product');
|
|
product.set({
|
|
download: file,
|
|
icon: file,
|
|
title: 'a product',
|
|
subtitle: 'a product',
|
|
order: 1,
|
|
productIdentifier: 'a-product',
|
|
});
|
|
return product.save();
|
|
});
|
|
}
|
|
|
|
describe('test validate_receipt endpoint', () => {
|
|
beforeEach(done => {
|
|
createProduct()
|
|
.then(done)
|
|
.catch(function() {
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should bypass appstore validation', done => {
|
|
request.post(
|
|
{
|
|
headers: {
|
|
'X-Parse-Application-Id': 'test',
|
|
'X-Parse-REST-API-Key': 'rest',
|
|
},
|
|
url: 'http://localhost:8378/1/validate_purchase',
|
|
json: true,
|
|
body: {
|
|
productIdentifier: 'a-product',
|
|
receipt: {
|
|
__type: 'Bytes',
|
|
base64: new Buffer('receipt', 'utf-8').toString('base64'),
|
|
},
|
|
bypassAppStoreValidation: true,
|
|
},
|
|
},
|
|
function(err, res, body) {
|
|
if (typeof body != 'object') {
|
|
fail('Body is not an object');
|
|
done();
|
|
} else {
|
|
expect(body.__type).toEqual('File');
|
|
const url = body.url;
|
|
request.get(
|
|
{
|
|
url: url,
|
|
},
|
|
function(err, res, body) {
|
|
expect(body).toEqual('download_file');
|
|
done();
|
|
}
|
|
);
|
|
}
|
|
}
|
|
);
|
|
});
|
|
|
|
it('should fail for missing receipt', done => {
|
|
request.post(
|
|
{
|
|
headers: {
|
|
'X-Parse-Application-Id': 'test',
|
|
'X-Parse-REST-API-Key': 'rest',
|
|
},
|
|
url: 'http://localhost:8378/1/validate_purchase',
|
|
json: true,
|
|
body: {
|
|
productIdentifier: 'a-product',
|
|
bypassAppStoreValidation: true,
|
|
},
|
|
},
|
|
function(err, res, body) {
|
|
if (typeof body != 'object') {
|
|
fail('Body is not an object');
|
|
done();
|
|
} else {
|
|
expect(body.code).toEqual(Parse.Error.INVALID_JSON);
|
|
done();
|
|
}
|
|
}
|
|
);
|
|
});
|
|
|
|
it('should fail for missing product identifier', done => {
|
|
request.post(
|
|
{
|
|
headers: {
|
|
'X-Parse-Application-Id': 'test',
|
|
'X-Parse-REST-API-Key': 'rest',
|
|
},
|
|
url: 'http://localhost:8378/1/validate_purchase',
|
|
json: true,
|
|
body: {
|
|
receipt: {
|
|
__type: 'Bytes',
|
|
base64: new Buffer('receipt', 'utf-8').toString('base64'),
|
|
},
|
|
bypassAppStoreValidation: true,
|
|
},
|
|
},
|
|
function(err, res, body) {
|
|
if (typeof body != 'object') {
|
|
fail('Body is not an object');
|
|
done();
|
|
} else {
|
|
expect(body.code).toEqual(Parse.Error.INVALID_JSON);
|
|
done();
|
|
}
|
|
}
|
|
);
|
|
});
|
|
|
|
it('should bypass appstore validation and not find product', done => {
|
|
request.post(
|
|
{
|
|
headers: {
|
|
'X-Parse-Application-Id': 'test',
|
|
'X-Parse-REST-API-Key': 'rest',
|
|
},
|
|
url: 'http://localhost:8378/1/validate_purchase',
|
|
json: true,
|
|
body: {
|
|
productIdentifier: 'another-product',
|
|
receipt: {
|
|
__type: 'Bytes',
|
|
base64: new Buffer('receipt', 'utf-8').toString('base64'),
|
|
},
|
|
bypassAppStoreValidation: true,
|
|
},
|
|
},
|
|
function(err, res, body) {
|
|
if (typeof body != 'object') {
|
|
fail('Body is not an object');
|
|
done();
|
|
} else {
|
|
expect(body.code).toEqual(Parse.Error.OBJECT_NOT_FOUND);
|
|
expect(body.error).toEqual('Object not found.');
|
|
done();
|
|
}
|
|
}
|
|
);
|
|
});
|
|
|
|
it('should fail at appstore validation', done => {
|
|
request.post(
|
|
{
|
|
headers: {
|
|
'X-Parse-Application-Id': 'test',
|
|
'X-Parse-REST-API-Key': 'rest',
|
|
},
|
|
url: 'http://localhost:8378/1/validate_purchase',
|
|
json: true,
|
|
body: {
|
|
productIdentifier: 'a-product',
|
|
receipt: {
|
|
__type: 'Bytes',
|
|
base64: new Buffer('receipt', 'utf-8').toString('base64'),
|
|
},
|
|
},
|
|
},
|
|
function(err, res, body) {
|
|
if (typeof body != 'object') {
|
|
fail('Body is not an object');
|
|
} else {
|
|
expect(body.status).toBe(21002);
|
|
expect(body.error).toBe(
|
|
'The data in the receipt-data property was malformed or missing.'
|
|
);
|
|
}
|
|
done();
|
|
}
|
|
);
|
|
});
|
|
|
|
it('should not create a _Product', done => {
|
|
const product = new Parse.Object('_Product');
|
|
product.save().then(
|
|
function() {
|
|
fail('Should not be able to save');
|
|
done();
|
|
},
|
|
function(err) {
|
|
expect(err.code).toEqual(Parse.Error.INCORRECT_TYPE);
|
|
done();
|
|
}
|
|
);
|
|
});
|
|
|
|
it('should be able to update a _Product', done => {
|
|
const query = new Parse.Query('_Product');
|
|
query
|
|
.first()
|
|
.then(function(product) {
|
|
if (!product) {
|
|
return Promise.reject(new Error('Product should be found'));
|
|
}
|
|
product.set('title', 'a new title');
|
|
return product.save();
|
|
})
|
|
.then(function(productAgain) {
|
|
expect(productAgain.get('downloadName')).toEqual(
|
|
productAgain.get('download').name()
|
|
);
|
|
expect(productAgain.get('title')).toEqual('a new title');
|
|
done();
|
|
})
|
|
.catch(function(err) {
|
|
fail(JSON.stringify(err));
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should not be able to remove a require key in a _Product', done => {
|
|
const query = new Parse.Query('_Product');
|
|
query
|
|
.first()
|
|
.then(function(product) {
|
|
if (!product) {
|
|
return Promise.reject(new Error('Product should be found'));
|
|
}
|
|
product.unset('title');
|
|
return product.save();
|
|
})
|
|
.then(function() {
|
|
fail('Should not succeed');
|
|
done();
|
|
})
|
|
.catch(function(err) {
|
|
expect(err.code).toEqual(Parse.Error.INCORRECT_TYPE);
|
|
expect(err.message).toEqual('title is required.');
|
|
done();
|
|
});
|
|
});
|
|
});
|