CheckoutFiBeanTests.java 6.5 KB
package fi.codecrew.moya.beans;

import static org.testng.AssertJUnit.*;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.FileReader;
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.beans.CheckoutFiBean.QueryBuilder;
import fi.codecrew.moya.checkoutfi.CheckoutFiParam;
import fi.codecrew.moya.clientutils.BortalLocalContextHolder;
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;

@Test
public class CheckoutFiBeanTests extends CheckoutFiBean {

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

	@Test
	public void testQuery() {
		QueryBuilder<CheckoutFiParam> queryBuilder = new QueryBuilder<CheckoutFiParam>(CheckoutFiParam.class, CheckoutFiParam.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.setSentDateTime(d);
		Product prod = new Product();
		prod.setName("Hurr");
		prod.setPrice(new BigDecimal(111.11).setScale(4, RoundingMode.HALF_UP));
		bill.getBillLines().add(new BillLine(bill, prod, new BigDecimal(5)));
		logger.info("Total price{}" + bill.getTotalPrice());
		final String priceInCents = Integer.valueOf(bill.totalPrice().multiply(TO_CENTS).intValue()).toString();
		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(CheckoutFiParam.STAMP, getStamp(bill));
		requiredParams.put("STAMP", "67890a1427495053");

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

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

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

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

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

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

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

		queryBuilder.addParam(CheckoutFiParam.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);
	}
}