/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.component.braintree;
import java.util.HashMap;
import java.util.UUID;
import com.braintreegateway.Customer;
import com.braintreegateway.CustomerRequest;
import com.braintreegateway.CustomerSearchRequest;
import com.braintreegateway.ResourceCollection;
import com.braintreegateway.Result;
import com.braintreegateway.ValidationError;
import com.braintreegateway.ValidationErrorCode;
import com.braintreegateway.ValidationErrors;
import com.braintreegateway.exceptions.NotFoundException;
import org.apache.camel.CamelExecutionException;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.braintree.internal.CustomerGatewayApiMethod;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CustomerGatewayIntegrationTest extends AbstractBraintreeTestSupport {
private static final String PATH_PREFIX = getApiNameAsString(CustomerGatewayApiMethod.class);
private static final Logger LOG = LoggerFactory.getLogger(CustomerGatewayIntegrationTest.class);
/**
* Customers management workflow:
* - create a customer
* - lookup by id
* - update first name
* - delete by id
* - confirm deletion by searching again
*
* @throws Exception
*/
@Test
public void testCustomerManagementWorkflow() throws Exception {
String customerLastName = UUID.randomUUID().toString();
String customerId = null;
// Create customer
Result<Customer> createResult = requestBody(
"direct://CREATE_IN_BODY",
new CustomerRequest()
.firstName("user")
.lastName(customerLastName)
.company("Apache")
.email("user@braintree.camel")
.website("http://user.braintree.camel"),
Result.class
);
assertNotNull(createResult);
assertTrue(createResult.isSuccess());
assertNotNull(createResult.getTarget());
assertNotNull(createResult.getTarget().getId());
customerId = createResult.getTarget().getId();
// Find customer by ID
Customer customer1 = requestBody("direct://FIND_IN_BODY", customerId, Customer.class);
assertNotNull(customer1);
assertEquals("user", customer1.getFirstName());
assertEquals(customerLastName, customer1.getLastName());
assertEquals("Apache", customer1.getCompany());
assertEquals("user@braintree.camel", customer1.getEmail());
assertEquals("http://user.braintree.camel", customer1.getWebsite());
// Update customer
HashMap<String, Object> headers = new HashMap<>();
headers.put("CamelBraintree.id", customerId);
Result<Customer> updateResult = requestBodyAndHeaders(
"direct://UPDATE_IN_BODY",
new CustomerRequest().firstName("user-mod"),
headers,
Result.class
);
assertNotNull(updateResult);
assertTrue(updateResult.isSuccess());
assertNotNull(updateResult.getTarget());
assertEquals("user-mod", updateResult.getTarget().getFirstName());
// Delete customer
Result<Customer> customerResult = requestBody("direct://DELETE_IN_BODY", customerId, Result.class);
assertNotNull(customerResult);
assertTrue(customerResult.isSuccess());
assertNull(customerResult.getTarget());
// Check if customer has been deleted customer
ResourceCollection<Customer> customers = requestBody(
"direct://SEARCH_IN_BODY",
new CustomerSearchRequest().id().is(customerId),
ResourceCollection.class
);
assertNotNull(customers);
assertEquals(0, customers.getMaximumSize());
}
@Test
public void testUpdateUnknownCustomer() throws Exception {
try {
String id = "unknown-" + UUID.randomUUID().toString();
HashMap<String, Object> headers = new HashMap<>();
headers.put("CamelBraintree.id", id);
requestBodyAndHeaders("direct://UPDATE_IN_BODY",
new CustomerRequest().firstName(id),
headers);
fail("Should have thrown NotFoundException");
} catch (CamelExecutionException e) {
assertIsInstanceOf(NotFoundException.class, e.getCause().getCause());
}
}
@Test
public void testSearchUnknownCustomer() throws Exception {
try {
requestBody("direct://FIND_IN_BODY", "unknown-" + UUID.randomUUID().toString());
fail("Should have thrown NotFoundException");
} catch (CamelExecutionException e) {
assertIsInstanceOf(NotFoundException.class, e.getCause().getCause());
}
}
@Test
public void testWrongCustomerCreateRequest() throws Exception {
// Create customer
Result<Customer> createResult = requestBody(
"direct://CREATE_IN_BODY",
new CustomerRequest()
.firstName("user")
.lastName(UUID.randomUUID().toString())
.company("Apache")
.email("wrongEmail")
.website("http://user.braintree.camel"),
Result.class
);
assertNotNull(createResult);
assertFalse(createResult.isSuccess());
final ValidationErrors errors = createResult.getErrors();
assertNotNull(errors);
assertNotNull(errors.getAllDeepValidationErrors());
ValidationError invalidMailError = null;
for (ValidationError error : errors.getAllDeepValidationErrors()) {
if (error.getCode() == ValidationErrorCode.CUSTOMER_EMAIL_FORMAT_IS_INVALID) {
invalidMailError = error;
break;
}
}
assertNotNull(invalidMailError);
}
// *************************************************************************
// Routes
// *************************************************************************
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() {
from("direct://CREATE_IN_BODY")
.to("braintree://" + PATH_PREFIX + "/create?inBody=request");
from("direct://DELETE_IN_BODY")
.to("braintree://" + PATH_PREFIX + "/delete?inBody=id");
from("direct://FIND_IN_BODY")
.to("braintree://" + PATH_PREFIX + "/find?inBody=id");
from("direct://SEARCH_IN_BODY")
.to("braintree://" + PATH_PREFIX + "/search?inBody=query");
from("direct://UPDATE_IN_BODY")
.to("braintree://" + PATH_PREFIX + "/update?inBody=request");
}
};
}
}