/**
 * KycTest.
 *
 * @author Jean-Pierre Boudic
 * @version 16.01.01
 * @since 15.11.01
 */
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class KycTest {

  public static SMoneyService service = SMoneyServiceFactory.createService();

  @Test
  public void kyc_001_create_one_file() throws IOException {
    final File tmpFile = File.createTempFile("file1", ".jpg");
    final BufferedWriter bw = new BufferedWriter(new FileWriter(tmpFile));
    bw.write("This is the temporary file content");
    bw.close();

    final RequestBody file1 = RequestBody.create(MediaType.parse("image/jpeg"), tmpFile);
    final Call<KycEntity> call = service.createKYCRequest(TestSettings.testUserAppUserId, file1);
    final Response<KycEntity> response = call.execute();
    if (response.code() != 201) {
      System.err.println(response.errorBody().string());
    }
    Assert.assertEquals(response.code(), 201);

    final KycEntity kyc = response.body();
    Assert.assertTrue(kyc.Id > 0);
    Assert.assertTrue(kyc.VoucherCopies.size() > 0);
    Assert.assertEquals(kyc.Status, KycStatusEnum.IN_PROGRESS);
    Assert.assertNotNull(kyc.RequestDate);

    AttachmentEntity attachment = kyc.VoucherCopies.get(0);
    Assert.assertTrue(attachment.Id > 0);
    Assert.assertTrue(attachment.Href != null);
    Assert.assertTrue(attachment.Name != null);
    Assert.assertTrue(attachment.ContentType.startsWith("image/"));
    Assert.assertTrue(attachment.Size > 0);
  }

  @Test
  public void kyc_002_create_multiple_files() throws IOException {
    final File tmpFile1 = File.createTempFile("file1", ".jpg");
    final BufferedWriter bw1 = new BufferedWriter(new FileWriter(tmpFile1));
    bw1.write("This is the temporary file content");
    bw1.close();

    final RequestBody file1 = RequestBody.create(MediaType.parse("image/jpeg"), tmpFile1);
    final File tmpFile2 = File.createTempFile("file2", ".png");
    final BufferedWriter bw2 = new BufferedWriter(new FileWriter(tmpFile2));
    bw2.write("This is the temporary file content");
    bw2.close();

    final RequestBody file2 = RequestBody.create(MediaType.parse("image/png"), tmpFile2);
    final Map<String, RequestBody> files = new HashMap<>();
    files.put("file1", file1);
    files.put("file2", file2);

    final Call<KycEntity> call = service.createKYCRequest(TestSettings.testUserAppUserId, files);
    final Response<KycEntity> response = call.execute();
    if (response.code() != 201) {
      System.err.println(response.errorBody().string());
    }
    Assert.assertEquals(response.code(), 201);

    final KycEntity kyc = response.body();
    Assert.assertTrue(kyc.Id > 0);
    Assert.assertTrue(kyc.VoucherCopies.size() > 0);
    Assert.assertEquals(kyc.Status, KycStatusEnum.IN_PROGRESS);
    Assert.assertNotNull(kyc.RequestDate);

    AttachmentEntity attachment = kyc.VoucherCopies.get(0);
    Assert.assertTrue(attachment.Id > 0);
    Assert.assertTrue(attachment.Href != null);
    Assert.assertTrue(attachment.Name != null);
    Assert.assertTrue(attachment.ContentType.startsWith("image/"));
    Assert.assertTrue(attachment.Size > 0);
  }

  @Test
  public void kyc_002_list() throws IOException {
    final Call<List<KycEntity>> listCall = service.listKYCRequests(TestSettings.testUserAppUserId);
    final Response<List<KycEntity>> response = listCall.execute();
    if (response.code() != 200) {
      System.err.println(response.errorBody().string());
    }
    Assert.assertEquals(response.code(), 200);

    final List<KycEntity> kycs = response.body();
    Assert.assertNotNull(kycs);
    Assert.assertTrue(kycs.size() > 0);

    KycEntity kyc = kycs.get(0);
    Assert.assertTrue(kyc.Id > 0);
    Assert.assertTrue(kyc.VoucherCopies.size() > 0);
    Assert.assertEquals(kyc.Status, KycStatusEnum.IN_PROGRESS);
    Assert.assertNotNull(kyc.RequestDate);

    AttachmentEntity attachment = kyc.VoucherCopies.get(0);
    Assert.assertTrue(attachment.Id > 0);
    Assert.assertTrue(attachment.Href != null);
    Assert.assertTrue(attachment.Name != null);
    Assert.assertTrue(attachment.ContentType.startsWith("image/"));
    Assert.assertTrue(attachment.Size > 0);
  }
}
/**
 * CardPaymentTest.
 *
 * @author Pierre Adam
 * @version 15.11
 * @since 15.11
 */
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class CardPaymentTest {

  public static final SMoneyService service = SMoneyServiceFactory.createService();

  public static final String orderId;

  static {
    orderId = UUID.randomUUID().toString();
  }

  @Test
  public void cardPayment_001_create() throws IOException {
    final CardPaymentEntity cardPaymentEntity = new CardPaymentEntity();
    cardPaymentEntity.Amount = 500L;
    cardPaymentEntity.OrderId = orderId;
    cardPaymentEntity.Beneficiary = new SubAccountEntity();
    cardPaymentEntity.Beneficiary.AppAccountId = TestSettings.testUserAppUserId;
    cardPaymentEntity.Message = "Recharge test";
    cardPaymentEntity.IsMine = true;
    cardPaymentEntity.UrlReturn = "http://127.0.0.1";
    cardPaymentEntity.Fee = 0L;

    final Call<CardPaymentEntity> call =
        service.createCardPayment(TestSettings.testUserAppUserId, cardPaymentEntity);
    final Response<CardPaymentEntity> response = call.execute();
    if (response.code() != 201) {
      System.err.println(response.errorBody().string());
    }
    Assert.assertEquals(response.code(), 201);

    final CardPaymentEntity cardPaymentEntityCreated = response.body();
    Assert.assertNotNull(cardPaymentEntityCreated.Id);
    Assert.assertNotNull(cardPaymentEntityCreated.Href);
  }

  @Test
  public void cardPayment_002_list() throws IOException {
    final Call<List<CardPaymentEntity>> listCall =
        service.listCardPayments(TestSettings.testUserAppUserId);
    final Response<List<CardPaymentEntity>> response = listCall.execute();
    if (response.code() != 200) {
      System.err.println(response.errorBody().string());
    }
    Assert.assertEquals(response.code(), 200);

    final List<CardPaymentEntity> cardPaymentEntityList = response.body();
    Assert.assertTrue(cardPaymentEntityList.size() > 0);
  }

  @Test
  public void cardPayment_003_get() throws IOException {
    final Call<CardPaymentEntity> call =
        service.getCardPayment(TestSettings.testUserAppUserId, orderId);
    final Response<CardPaymentEntity> response = call.execute();
    if (response.code() != 200) {
      System.err.println(response.errorBody().string());
    }
    Assert.assertEquals(response.code(), 200);

    final CardPaymentEntity cardPaymentEntity = response.body();
    Assert.assertEquals(cardPaymentEntity.Message, "Recharge test");
  }
}