paymill-wrapper
Version:
PAYMILL REST API Javascrip wrapper. Work with Node, parse.com and is easily extendable for other platforms
388 lines (360 loc) • 11.6 kB
JavaScript
var pm = require('../paymill.node.js');
var when = require("when");
var expect = require("expect.js");
var https = require('https');
var when = require("when");
var pmc = null;
var defaultCurrency = "EUR";
var defaultToken = "098f6bcd4621d373cade4e832627b4f6";
var webhookEvent = pm.Webhook.EventType.TRANSACTION_SUCCEDED;
var webhookEventArray = [pm.Webhook.EventType.TRANSACTION_SUCCEDED,pm.Webhook.EventType.TRANSACTION_FAILED];
var publicKey = process.env.PMPUBLICAPIKEY;
if (!process.env.PMAPIKEY) {
throw new Error("you have to have a valid private kay in a PMAPIKEY environment variable.");
} else {
pmc = pm.getContext(process.env.PMAPIKEY);
// try to get a new token
//try {
https.get(getTokenUrl(), function(res) {
res.on("data", function(chunk) {
try {
chunks = chunk.toString();
obj = JSON.parse(chunks.substring(15,chunks.length - 1));
defaultToken = obj.transaction.identification.uniqueId;
console.log("Extracted token:" + defaultToken);
} catch (e) {
console.log("Cannot extract token from:" + chunk + ". Exception:" + e);
}
});
}).on('error', function(e) {
console.log("Cannot request token: " + e.message);
});
//} catch(e) {
// console.error("Could not fetch new token (" + e + ")")
//}
}
exports.pm = pm;
exports.pmc = pmc;
exports.webhookEvent = webhookEvent;
exports.webhookEventArray = webhookEventArray;
exports.expect = expect;
exports.apiKey = process.env.PMAPIKEY;
exports.token = defaultToken;
exports.getToken = getToken;
function getToken() {
var defer = when.defer();
https.get(getTokenUrl(), function(res) {
res.on("data", function(chunk) {
try {
chunks = chunk.toString();
obj = JSON.parse(chunks.substring(15,chunks.length - 1));
var result = obj.transaction.identification.uniqueId;
defer.resolve(result);
} catch (e) {
defer.reject("Cannot extract token from:" + chunk + ". Exception:" + e);
}
});
}).on('error', function(e) {
defer.reject("Cannot request token: " + e.message);
});
return defer.promise;
}
exports.currency = defaultCurrency;
exports.toStrinAmount = function(amount) {
var res = "" + amount;
while (res.length < 3) {
res = "0" + res;
}
return res;
};
randomAmount = function(from, to) {
if (!from) {
return randomAmount(100, to);
}
if (!to) {
return randomAmount(from, 10000);
}
return from + Math.floor(Math.random() * (to - from));
};
exports.randomAmount = randomAmount;
exports.randomDescription = function() {
return "asb" + (1000 + Math.floor(Math.random() * 10000));
};
exports.createClient = createClient;
function createClient() {
var description = "desc" + randomAmount();
var email = "user" + randomAmount() + "@test.com";
return pmc.clients.create(email, description);
}
exports.createTransaction = createTransaction;
function createTransaction() {
return pmc.transactions.createWithToken(defaultToken, randomAmount(), defaultCurrency, "test1234");
}
exports.createRefund = createRefund;
function createRefund() {
var transaction;
return createTransaction().then(function(result) {
transaction = result;
expect(result).to.be.a(pm.Transaction);
return pmc.transactions.refund(result, 150, "testrefund");
}).then(function(refund) {
expect(refund).to.be.a(pm.Refund);
expect(refund.amount.toString()).to.be("150");
expect(refund.description).to.be("testrefund");
expect(refund.transaction.id).to.be(transaction.id);
return when.resolve(refund);
}).then(function(result) {
return when.resolve(result);
}, function(err) {
return when.reject(err);
});
}
exports.createPayment = createPayment;
function createPayment(client) {
if (client) {
var id;
if (client.id) {
id = client.id;
} else {
id = client;
}
return pmc.payments.create(defaultToken, client).then(function(payment) {
expect(payment).to.be.a(pm.Payment);
expect(payment.client.id).to.be(id);
checkPaymentFields(payment);
return when.resolve(payment);
}).then(function(result) {
return when.resolve(result);
}, function(err) {
return when.reject(err);
});
} else {
return pmc.payments.create(defaultToken).then(function(payment) {
expect(payment).to.be.a(pm.Payment);
checkPaymentFields(payment);
return when.resolve(payment);
}).then(function(result) {
return when.resolve(result);
}, function(err) {
return when.reject(err);
});
}
}
exports.createOffer = createOffer;
function createOffer(trialStart, interval) {
var amount = randomAmount();
var currency = defaultCurrency;
var name = "offer" + randomAmount();
if (!interval) {
interval = new pm.Interval(2, pm.Interval.Unit.WEEK);
}
return pmc.offers.create(amount, currency, interval, name, trialStart).then(function(offer) {
expect(offer).to.be.a(pm.Offer);
checkOfferFields(offer);
expect(offer.amount).to.be("" + amount);
expect(offer.name).to.be(name);
expect(offer.currency).to.be(currency);
expect(offer.interval.toString()).to.be(interval.toString());
expect(offer.interval.length).to.be(interval.length);
expect(offer.interval.unit).to.be(interval.unit);
return when.resolve(offer);
}).then(function(result) {
return when.resolve(result);
}, function(err) {
return when.reject(err);
});
}
exports.createEmailWebhook = createEmailWebhook;
function createEmailWebhook() {
var email = "testuser" + randomAmount() + "@test.com";
return pmc.webhooks.createEmail(email, webhookEventArray).then(function(webhook) {
expect(webhook.email).to.be(email);
expect(webhook.event_types[0]).to.be(webhookEventArray[0]);
return when.resolve(webhook);
}).then(function(result) {
return when.resolve(result);
}, function(err) {
return when.reject(err);
});
}
exports.createUrlWebhook = createUrlWebhook;
function createUrlWebhook() {
var url = "http://test" + randomAmount() + ".test.com";
return pmc.webhooks.createUrl(url, webhookEventArray).then(function(webhook) {
expect(webhook.url).to.be(url);
expect(webhook.event_types[0]).to.be(webhookEventArray[0]);
expect(webhook.event_types[1]).to.be(webhookEventArray[1]);
return when.resolve(webhook);
}).then(function(result) {
return when.resolve(result);
}, function(err) {
return when.reject(err);
});
}
exports.createSubscription = createSubscription;
function createSubscription() {
var payment;
var client;
var offer;
return pmc.clients.create().then(function(res) {
client = res;
return createPayment(client);
}).then(function(res) {
payment = res;
return createOffer();
}).then(function(res) {
offer = res;
return pmc.subscriptions.createWithAll(payment, client, offer );
}).then(function(sub) {
checkSubscriptionFields(sub);
expect(sub.payment.id).to.be(payment.id);
expect(sub.client.id).to.be(client.id);
expect(sub.offer.id).to.be(offer.id);
return when.resolve(sub);
}).then(function(result) {
return when.resolve(result);
}, function(err) {
return when.reject(err);
});
}
exports.verifyListOrderChanged = verifyListOrderChanged;
function verifyListOrderChanged(service, orderOne, orderTwo) {
var firstId;
return service.list(null, null, null, orderOne).then(function(firstList) {
expect(firstList).to.be.a(pm.PaymillList);
firstId = firstList.items[0].id;
return service.list(null, null, null, orderTwo);
}).then(function(secondlist) {
var secId = secondlist.items[0].id;
expect(secId).to.be.ok();
expect(secondlist.items[0].id).to.not.be(firstId);
return when.resolve(secondlist);
}).then(function(result) {
return when.resolve(result);
}, function(err) {
return when.reject(err);
});
;
}
exports.verifyListFilter = verifyListFilter;
function verifyListFilter(factory, service, filter, property) {
var original;
return (factory()).then(function(result) {
original = result[property];
filter[property](original);
return service.list(null, null, filter);
}).then(function(list) {
expect(list).to.be.a(pm.PaymillList);
expect(list.items.length).to.be.above(0);
//if it is a pm object
if (original.id) {
expect(list.items[0][property].id).to.be(original.id);
} else {
expect(list.items[0][property]).to.be(original);
}
return when.resolve(list);
}).then(function(result) {
return when.resolve(result);
}, function(err) {
return when.reject(err);
});
};
exports.verifyListCountOffset = verifyListCountOffset;
function verifyListCountOffset(service) {
var count;
var offset;
return service.list().then(function(allList) {
expect(allList).to.be.a(pm.PaymillList);
var all = allList.count;
count = Math.min(all, 5);
offset = Math.min(all - count, 5);
return service.list(count, offset);
}).then(function(list) {
expect(list).to.be.a(pm.PaymillList);
expect(list.items.length).to.be(count);
return when.resolve(list);
}).then(function(result) {
return when.resolve(result);
}, function(err) {
return when.reject(err);
});
};
exports.verifyRemoveWithDetail = verifyRemoveWithDetail;
function verifyRemoveWithDetail(factory, service, type) {
var some;
return (factory()).then(function(result) {
some = result;
return service.remove(some);
}).then(function(removed) {
expect(removed).to.be.a(type);
return service.detail(removed);
}).then(function(result) {
return when.reject(new Error("detail should fail after remove"));
}, function(err) {
return when.resolve(some);
});
};
exports.verifyUpdate = verifyUpdate;
function verifyUpdate(factory, service, property, newvalue) {
var some;
return (factory()).then(function(result) {
some = result;
some[property] = newvalue;
return service.update(some);
}).then(function(updated) {
if (updated[property].id) {
expect(updated[property].id).to.be(newvalue.id);
} else {
expect(updated[property]).to.be(newvalue);
}
return service.detail(updated);
}).then(function(detailed) {
if (detailed[property].id) {
expect(detailed[property].id).to.be(newvalue.id);
} else {
expect(detailed[property]).to.be(newvalue);
}
return when.resolve(detailed);
}).then(function(result) {
return when.resolve(result);
}, function(err) {
return when.reject(err);
});
};
exports.datesAroundTheSame = datesAroundTheSame;
function datesAroundTheSame(firstDate,secondDate,minutes) {
if (!minutes) {
minutes = 60;
}
var timespan = minutes * 60 * 1000;
return Math.abs( firstDate.getTime() - secondDate.getTime() ) < timespan;
};
function checkOfferFields(target) {
expect(target.id).to.be.ok();
expect(target.amount).to.be.ok();
expect(target.name).to.be.ok();
expect(target.currency).to.be.ok();
expect(target.subscription_count).to.be.ok();
expect(target.created_at).to.be.ok();
expect(target.updated_at).to.be.ok();
}
function checkPaymentFields(target) {
expect(target.id).to.be.ok();
expect(target.card_type).to.be.ok();
expect(target.last4).to.be.ok();
expect(target.expire_month).to.be.ok();
expect(target.expire_year).to.be.ok();
expect(target.created_at).to.be.ok();
expect(target.updated_at).to.be.ok();
}
function checkSubscriptionFields(target) {
expect(target.id).to.be.ok();
expect(target.offer).to.be.ok();
expect(target.payment).to.be.ok();
expect(target.client).to.be.ok();
expect(target.created_at).to.be.ok();
expect(target.updated_at).to.be.ok();
}
function getTokenUrl() {
return "https://test-token.paymill.com/?transaction.mode=CONNECTOR_TEST&channel.id=" + publicKey + "&jsonPFunction=paymilljstests&account.number=4111111111111111&account.expiry.month=12&account.expiry.year=2015&account.verification=123&account.holder=Max%20Mustermann&presentation.amount3D=&presentation.currency3D=";
}