package com.sap.core.odata.core.batch; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; import com.sap.core.odata.api.batch.BatchException; import com.sap.core.odata.api.client.batch.BatchChangeSet; import com.sap.core.odata.api.client.batch.BatchChangeSetPart; import com.sap.core.odata.api.client.batch.BatchPart; import com.sap.core.odata.api.client.batch.BatchQueryPart; import com.sap.core.odata.testutil.helper.StringHelper; public class BatchRequestWriterTest { private static final String POST = "POST"; private static final String GET = "GET"; private static final String PUT = "PUT"; private static final String BOUNDARY = "batch_123"; private void checkMimeHeaders(final String requestBody) { assertTrue(requestBody.contains("Content-Type: application/http")); assertTrue(requestBody.contains("Content-Transfer-Encoding: binary")); } @Test public void testBatchQueryPart() throws BatchException, IOException { List<BatchPart> batch = new ArrayList<BatchPart>(); Map<String, String> headers = new HashMap<String, String>(); headers.put("Accept", "application/json"); BatchPart request = BatchQueryPart.method(GET).uri("Employees").headers(headers).build(); batch.add(request); BatchRequestWriter writer = new BatchRequestWriter(); InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY); String requestBody = StringHelper.inputStreamToString(batchRequest); assertNotNull(batchRequest); checkMimeHeaders(requestBody); assertTrue(requestBody.contains("--batch_")); assertTrue(requestBody.contains("GET Employees HTTP/1.1")); checkHeaders(headers, requestBody); } @Test public void testBatchChangeSet() throws IOException, BatchException { List<BatchPart> batch = new ArrayList<BatchPart>(); Map<String, String> headers = new HashMap<String, String>(); headers.put("content-type", "application/json"); BatchChangeSetPart request = BatchChangeSetPart.method(PUT) .uri("Employees('2')") .body("{\"Возраст\":40}") .headers(headers) .contentId("111") .build(); BatchChangeSet changeSet = BatchChangeSet.newBuilder().build(); changeSet.add(request); batch.add(changeSet); BatchRequestWriter writer = new BatchRequestWriter(); InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY); String requestBody = StringHelper.inputStreamToString(batchRequest, true); assertNotNull(batchRequest); checkMimeHeaders(requestBody); checkHeaders(headers, requestBody); assertTrue(requestBody.contains("--batch_")); assertTrue(requestBody.contains("--changeset_")); assertTrue(requestBody.contains("PUT Employees('2') HTTP/1.1")); assertTrue(requestBody.contains("{\"Возраст\":40}")); } @Test public void testBatchWithGetAndPost() throws BatchException, IOException { List<BatchPart> batch = new ArrayList<BatchPart>(); Map<String, String> headers = new HashMap<String, String>(); headers.put("Accept", "application/json"); BatchPart request = BatchQueryPart.method(GET).uri("Employees").headers(headers).contentId("000").build(); batch.add(request); Map<String, String> changeSetHeaders = new HashMap<String, String>(); changeSetHeaders.put("content-type", "application/json"); String body = "/9j/4AAQSkZJRgABAQEBLAEsAAD/4RM0RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEA"; BatchChangeSetPart changeRequest = BatchChangeSetPart.method(POST) .uri("Employees") .body(body) .headers(changeSetHeaders) .contentId("111") .build(); BatchChangeSet changeSet = BatchChangeSet.newBuilder().build(); changeSet.add(changeRequest); batch.add(changeSet); BatchRequestWriter writer = new BatchRequestWriter(); InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY); String requestBody = StringHelper.inputStreamToString(batchRequest); assertNotNull(batchRequest); checkMimeHeaders(requestBody); checkHeaders(headers, requestBody); checkHeaders(changeSetHeaders, requestBody); assertTrue(requestBody.contains("GET Employees HTTP/1.1")); assertTrue(requestBody.contains("POST Employees HTTP/1.1")); assertTrue(requestBody.contains(body)); } @Test public void testChangeSetWithContentIdReferencing() throws BatchException, IOException { List<BatchPart> batch = new ArrayList<BatchPart>(); Map<String, String> changeSetHeaders = new HashMap<String, String>(); changeSetHeaders.put("content-type", "application/json"); String body = "/9j/4AAQSkZJRgABAQEBLAEsAAD/4RM0RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEA"; BatchChangeSetPart changeRequest = BatchChangeSetPart.method(POST) .uri("Employees('2')") .body(body) .headers(changeSetHeaders) .contentId("1") .build(); BatchChangeSet changeSet = BatchChangeSet.newBuilder().build(); changeSet.add(changeRequest); changeSetHeaders = new HashMap<String, String>(); changeSetHeaders.put("content-type", "application/json;odata=verbose"); BatchChangeSetPart changeRequest2 = BatchChangeSetPart.method(PUT) .uri("$/ManagerId") .body("{\"ManagerId\":1}") .headers(changeSetHeaders) .contentId("2") .build(); changeSet.add(changeRequest2); batch.add(changeSet); BatchRequestWriter writer = new BatchRequestWriter(); InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY); String requestBody = StringHelper.inputStreamToString(batchRequest); assertNotNull(batchRequest); checkMimeHeaders(requestBody); assertTrue(requestBody.contains("POST Employees('2') HTTP/1.1")); assertTrue(requestBody.contains("PUT $/ManagerId HTTP/1.1")); assertTrue(requestBody.contains(BatchHelper.HTTP_CONTENT_ID + ": 1")); assertTrue(requestBody.contains(BatchHelper.HTTP_CONTENT_ID + ": 2")); assertTrue(requestBody.contains(body)); } @Test public void testBatchWithTwoChangeSets() throws BatchException, IOException { List<BatchPart> batch = new ArrayList<BatchPart>(); Map<String, String> changeSetHeaders = new HashMap<String, String>(); changeSetHeaders.put("content-type", "application/json"); changeSetHeaders.put("content-Id", "111"); String body = "/9j/4AAQSkZJRgABAQEBLAEsAAD/4RM0RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEA"; BatchChangeSetPart changeRequest = BatchChangeSetPart.method(POST) .uri("Employees") .body(body) .headers(changeSetHeaders) .build(); BatchChangeSet changeSet = BatchChangeSet.newBuilder().build(); changeSet.add(changeRequest); batch.add(changeSet); Map<String, String> changeSetHeaders2 = new HashMap<String, String>(); changeSetHeaders2.put("content-type", "application/json;odata=verbose"); changeSetHeaders2.put("content-Id", "222"); BatchChangeSetPart changeRequest2 = BatchChangeSetPart.method(PUT) .uri("Employees('2')/ManagerId") .body("{\"ManagerId\":1}") .headers(changeSetHeaders2) .build(); BatchChangeSet changeSet2 = BatchChangeSet.newBuilder().build(); changeSet2.add(changeRequest2); batch.add(changeSet2); BatchRequestWriter writer = new BatchRequestWriter(); InputStream batchRequest = writer.writeBatchRequest(batch, BOUNDARY); String requestBody = StringHelper.inputStreamToString(batchRequest); assertNotNull(batchRequest); checkMimeHeaders(requestBody); assertTrue(requestBody.contains("POST Employees HTTP/1.1")); assertTrue(requestBody.contains("PUT Employees('2')/ManagerId HTTP/1.1")); assertTrue(requestBody.contains(body)); } private void checkHeaders(final Map<String, String> headers, final String requestBody) { for (Map.Entry<String, String> header : headers.entrySet()) { assertTrue(requestBody.contains(header.getKey() + ": " + header.getValue())); } } @Test(expected = IllegalArgumentException.class) public void testBatchQueryPartWithInvalidMethod() throws BatchException, IOException { BatchQueryPart.method(PUT).uri("Employees").build(); } @Test(expected = IllegalArgumentException.class) public void testBatchChangeSetPartWithInvalidMethod() throws BatchException, IOException { BatchChangeSetPart.method(GET).uri("Employees('2')").build(); } }