CheckoutFiBeanTest.java 6.88 KB
package fi.codecrew.moya.beans;

import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import static org.testng.AssertJUnit.fail;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.http.NameValuePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.annotations.Test;

import fi.codecrew.moya.checkoutfi.CheckoutFiPaymentParam;
import fi.codecrew.moya.checkoutfi.CheckoutQueryParam;
import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.BillLine;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.util.CheckoutBank;

public class CheckoutFiBeanTest {

	@Test
	public void testQuery() {
		new CheckoutFiBeanMock().testQuery();
	}

	@Test
	public void testXml() {
		new CheckoutFiBeanMock().testXml();

	}

	@Test
	public void testPollXml() throws UnsupportedEncodingException
	{
		new CheckoutFiBeanMock().testPollXml();

	}

	public static class CheckoutFiBeanMock extends CheckoutFiBean {

		private static final Logger logger = LoggerFactory.getLogger(CheckoutFiBeanTest.class);

		public void testQuery() {

			QueryBuilder queryBuilder = new QueryBuilder(CheckoutFiPaymentParam.values(), new Date(System.currentTimeMillis() + 60000), "375917", "SAIPPUAKAUPPIAS");

			assertTrue("Credentials are valid!", queryBuilder.isCredentialsValid());

			final String returnUrl = new StringBuilder()
					.append("https://")
					.append("localhost")
					.append("/MoyaWeb/checkout/")
					.toString();

			LanEvent lanevent = new LanEvent();
			lanevent.setReferenceNumberBase(100000);
			Date d = new Date(1427495053008l);

			Bill bill = new Bill();
			bill.setEvent(lanevent);
			bill.setId(67890);
			bill.setBillNumber(12345);
			bill.setAddr1("Teemu Teekkari");
			bill.setAddr2("Hervannantie 1");
			bill.setAddr3("33600 Tampere");
			bill.setAddr4("FINLAND");
			bill.setSentDate(d);
			Product prod = new Product();
			prod.setName("Hurr");
			prod.setPrice(BigDecimal.valueOf(111.11).setScale(4, RoundingMode.HALF_UP));
			bill.getBillLines().add(new BillLine(bill, prod, new BigDecimal(5)));

			final String priceInCents = Integer.toString(bill.totalPrice().multiply(TO_CENTS).intValue());
			final Map<String, String> requiredParams = new HashMap<>();
			requiredParams.put("VERSION", "0001");
			requiredParams.put("COUNTRY", "FIN");
			requiredParams.put("CURRENCY", "EUR");
			requiredParams.put("DEVICE", "10");
			requiredParams.put("CONTENT", "1");
			requiredParams.put("TYPE", "0");
			requiredParams.put("ALGORITHM", "2");
			requiredParams.put("LANGUAGE", "FI");

			queryBuilder.addParam((CheckoutQueryParam) CheckoutFiPaymentParam.STAMP, getStamp(bill));
			requiredParams.put("STAMP", "67890a1427495053");

			queryBuilder.addParam(CheckoutFiPaymentParam.AMOUNT, priceInCents);
			requiredParams.put("AMOUNT", "55555");

			queryBuilder.addParam(CheckoutFiPaymentParam.REFERENCE, bill.getReferenceNumber().toString());
			// 112345 + checksum(2)
			requiredParams.put("REFERENCE", "1123452");

			queryBuilder.addParam(CheckoutFiPaymentParam.MERCHANT, queryBuilder.getMerchantId());
			requiredParams.put("MERCHANT", "375917");

			queryBuilder.addParam(CheckoutFiPaymentParam.RETURN, returnUrl + "return.jsf");
			requiredParams.put("RETURN", "https://localhost/MoyaWeb/checkout/return.jsf");

			queryBuilder.addParam(CheckoutFiPaymentParam.CANCEL, returnUrl + "cancel.jsf");
			requiredParams.put("CANCEL", "https://localhost/MoyaWeb/checkout/cancel.jsf");

			queryBuilder.addParam(CheckoutFiPaymentParam.REJECT, returnUrl + "reject.jsf");
			requiredParams.put("REJECT", "https://localhost/MoyaWeb/checkout/reject.jsf");

			queryBuilder.addParam(CheckoutFiPaymentParam.DELAYED, returnUrl + "delayed.jsf");
			requiredParams.put("DELAYED", "https://localhost/MoyaWeb/checkout/delayed.jsf");

			queryBuilder.addParam(CheckoutFiPaymentParam.DELIVERY_DATE, new SimpleDateFormat(DATEFORMAT).format(d));
			requiredParams.put("DELIVERY_DATE", "20150328");

			requiredParams.put("MAC", "7FBDC5A633794B7292E6B02020330E64");

			List<NameValuePair> nvpairs = queryBuilder.getNameValuePairs();
			for (NameValuePair p : nvpairs) {
				assertTrue("Missing required param: " + p.getName() + " val " + p.getValue(), requiredParams.containsKey(p.getName()));
				String val = requiredParams.remove(p.getName());
				assertEquals("Wrong value for " + p.getName(), val, p.getValue());
			}
			for (Entry<String, String> p : requiredParams.entrySet()) {
				logger.warn("Not found param {} with value {}", p.getKey(), p.getValue());
			}
		}

		@Test
		public void testXml()
		{
			InputStream testfile1 = getClass().getResourceAsStream("checkoutTestfile.xml");
			List<CheckoutBank> ret = CheckoutFiBean.parseTokenXml(testfile1);

			// Huom! Neopay, ape ja tilisiirto poistettu parsinnassa.
			assertEquals(8, ret.size());

			for (int i = 0; i < ret.size(); ++i) {
				CheckoutBank bnk = ret.get(i);
				switch (i) {
				case 0:
					assertEquals("nordea", bnk.getKey());
					assertEquals(17, bnk.getPostParams().size());
					break;
				case 1:
					assertEquals("osuuspankki", bnk.getKey());
					assertEquals(13, bnk.getPostParams().size());
					break;
				case 2:
					assertEquals("samlink", bnk.getKey());
					assertEquals(13, bnk.getPostParams().size());
					break;
				case 3:
					assertEquals("sampo", bnk.getKey());
					assertEquals(9, bnk.getPostParams().size());
					break;
				case 4:
					assertEquals("handelsbanken", bnk.getKey());
					assertEquals(13, bnk.getPostParams().size());
					break;
				case 5:
					assertEquals("spankki", bnk.getKey());
					assertEquals(17, bnk.getPostParams().size());
					break;
				case 6:
					assertEquals("alandsbanken", bnk.getKey());
					assertEquals(18, bnk.getPostParams().size());
					break;
				case 7:
					assertEquals("tapiola", bnk.getKey());
					assertEquals(18, bnk.getPostParams().size());
					break;
				case 8:
					assertEquals("neopay", bnk.getKey());
					assertEquals(9, bnk.getPostParams().size());
					break;
				case 9:
					assertEquals("tilisiirto", bnk.getKey());
					assertEquals(6, bnk.getPostParams().size());
					break;
				case 10:
					assertEquals("ape", bnk.getKey());
					assertEquals(4, bnk.getPostParams().size());
					break;

				default:
					fail("Wrong number of banks: " + i);
					break;
				}
			}
		}

		private static final String pollReturnXML = "<?xml version=\"1.0\"?> <trade> <status> 2 </status></trade> ";
		private static final String LATIN1 = "ISO-8859-1";

		@Test
		public void testPollXml() throws UnsupportedEncodingException
		{
			String ret = CheckoutFiBean.parsePollXml(new ByteArrayInputStream(pollReturnXML.getBytes(LATIN1)));

			assertEquals("2", ret);
		}
	}
}