diff --git a/build.gradle b/build.gradle index f2b7de3..c55bb2e 100644 --- a/build.gradle +++ b/build.gradle @@ -167,6 +167,7 @@ dependencies { testImplementation 'org.mockito:mockito-core:3.12.4' testImplementation 'io.github.cdimascio:dotenv-java:3.0.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.1' + testImplementation 'org.wiremock:wiremock-standalone:3.13.1' } javadoc { diff --git a/src/main/java/Avalara/SDK/api/EInvoicing/V1/DocumentsApi.java b/src/main/java/Avalara/SDK/api/EInvoicing/V1/DocumentsApi.java index 75f2e2b..c48ade2 100644 --- a/src/main/java/Avalara/SDK/api/EInvoicing/V1/DocumentsApi.java +++ b/src/main/java/Avalara/SDK/api/EInvoicing/V1/DocumentsApi.java @@ -23,40 +23,23 @@ import Avalara.SDK.ApiClient; import Avalara.SDK.ApiException; import Avalara.SDK.ApiResponse; -import Avalara.SDK.Configuration; -import Avalara.SDK.Pair; -import Avalara.SDK.ProgressRequestBody; -import Avalara.SDK.ProgressResponseBody; import Avalara.SDK.AvalaraMicroservice; - - -import com.google.gson.reflect.TypeToken; - -import java.io.IOException; -import java.util.*; - - -import Avalara.SDK.model.EInvoicing.V1.BadDownloadRequest; -import Avalara.SDK.model.EInvoicing.V1.BadRequest; -import java.math.BigDecimal; +import Avalara.SDK.Pair; import Avalara.SDK.model.EInvoicing.V1.DocumentFetch; import Avalara.SDK.model.EInvoicing.V1.DocumentListResponse; import Avalara.SDK.model.EInvoicing.V1.DocumentStatusResponse; -import Avalara.SDK.model.EInvoicing.V1.DocumentSubmissionError; import Avalara.SDK.model.EInvoicing.V1.DocumentSubmitResponse; -import Avalara.SDK.model.EInvoicing.V1.FetchDocumentsRequest; -import java.io.File; -import Avalara.SDK.model.EInvoicing.V1.ForbiddenError; -import Avalara.SDK.model.EInvoicing.V1.InternalServerError; -import Avalara.SDK.model.EInvoicing.V1.NotFoundError; -import java.time.OffsetDateTime; import Avalara.SDK.model.EInvoicing.V1.SubmitDocumentMetadata; - +import com.google.gson.reflect.TypeToken; +import java.io.File; import java.lang.reflect.Type; +import java.math.BigDecimal; +import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.MissingFormatArgumentException; public class DocumentsApi { private ApiClient localVarApiClient; @@ -140,20 +123,20 @@ public okhttp3.Call downloadDocumentCall(DownloadDocumentRequest requestParamete if (requestParameters.getAccept() != null) { localVarHeaderParams.put("Accept", localVarApiClient.parameterToString(requestParameters.getAccept())); + } else { + final String[] localVarAccepts = { + "application/pdf", "application/xml", "application/json" + }; + final String localVarAccept = localVarApiClient.selectHeaderAccept(localVarAccepts); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } } if (requestParameters.getXAvalaraClient() != null) { localVarHeaderParams.put("X-Avalara-Client", localVarApiClient.parameterToString(requestParameters.getXAvalaraClient())); } - final String[] localVarAccepts = { - "application/pdf", "application/xml", "application/json" - }; - final String localVarAccept = localVarApiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) { - localVarHeaderParams.put("Accept", localVarAccept); - } - final String[] localVarContentTypes = { }; diff --git a/src/test/java/Avalara/SDK/api/A1099/V2/A1099Test.java b/src/test/java/Avalara/SDK/api/A1099/V2/A1099Test.java index a5eb6ff..8e3ecc7 100644 --- a/src/test/java/Avalara/SDK/api/A1099/V2/A1099Test.java +++ b/src/test/java/Avalara/SDK/api/A1099/V2/A1099Test.java @@ -1,27 +1,28 @@ package Avalara.SDK.api.A1099.V2; -import Avalara.SDK.*; -import Avalara.SDK.api.A1099.V2.Issuers1099Api; -import Avalara.SDK.api.A1099.V2.CompaniesW9Api; -import Avalara.SDK.api.A1099.V2.Forms1099Api; -import Avalara.SDK.api.A1099.V2.FormsW9Api; -import Avalara.SDK.model.A1099.V2.*; +import Avalara.SDK.ApiClient; +import Avalara.SDK.AvaTaxEnvironment; +import Avalara.SDK.Configuration; +import Avalara.SDK.model.A1099.V2.PaginatedQueryResultModelCompanyResponse; +import Avalara.SDK.model.A1099.V2.PaginatedQueryResultModelIssuerResponse; import io.github.cdimascio.dotenv.Dotenv; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + /** * API tests for A1099 endpoints using JUnit. */ -public class A1099Test { +class A1099Test { + private ApiClient apiClient; private Issuers1099Api issuersApi; private CompaniesW9Api companiesApi; private Forms1099Api forms1099Api; - @Before - public void setUp() throws Exception { + @BeforeEach + void setUp() throws Exception { // Load environment variables Dotenv dotenv = Dotenv.configure().ignoreIfMissing().load(); @@ -41,7 +42,7 @@ public void setUp() throws Exception { } @Test - public void testGetIssuers() throws Exception { + void testGetIssuers() throws Exception { Issuers1099Api.GetIssuersRequest request = issuersApi.getGetIssuersRequest(); request.set$top(10); request.set$skip(0); @@ -49,12 +50,12 @@ public void testGetIssuers() throws Exception { request.setXCorrelationId("2bbbed41-2466-4cf6-9cca-a3258bdc8eba"); PaginatedQueryResultModelIssuerResponse response = issuersApi.getIssuers(request); - Assert.assertNotNull(response); - Assert.assertNotNull(response.getValue()); + Assertions.assertNotNull(response); + Assertions.assertNotNull(response.getValue()); } @Test - public void testGetCompanies() throws Exception { + void testGetCompanies() throws Exception { CompaniesW9Api.GetCompaniesRequest request = companiesApi.getGetCompaniesRequest(); request.set$top(10); request.set$skip(0); @@ -62,31 +63,31 @@ public void testGetCompanies() throws Exception { request.setXCorrelationId("2bbbed41-2466-4cf6-9cca-a3258bdc8eba"); PaginatedQueryResultModelCompanyResponse response = companiesApi.getCompanies(request); - Assert.assertNotNull(response); - Assert.assertNotNull(response.getValue()); + Assertions.assertNotNull(response); + Assertions.assertNotNull(response.getValue()); } - // @Test - // public void testList1099Forms() throws Exception { - // Forms1099Api.List1099FormsRequest request = - // forms1099Api.getList1099FormsRequest(); - // request.set$top(10); - // request.set$skip(0); - // request.setXCorrelationId("2bbbed41-2466-4cf6-9cca-a3258bdc8eba"); - - // Form1099List response = forms1099Api.list1099Forms(request); - // Assert.assertNotNull(response); - // Assert.assertNotNull(response.getData()); - // } - - // @Test - // public void testListW9Forms() throws Exception { - // FormsW9Api.ListW9FormsRequest request = formsW9Api.getListW9FormsRequest(); - // request.setTop(10); - // request.setSkip(0); - - // ListW9FormsResponse response = formsW9Api.listW9Forms(request); - // Assert.assertNotNull(response); - // Assert.assertNotNull(response.getValue()); - // } +// @Test +// void testList1099Forms() throws Exception { +// Forms1099Api.List1099FormsRequest request = +// forms1099Api.getList1099FormsRequest(); +// request.set$top(10); +// request.set$skip(0); +// request.setXCorrelationId("2bbbed41-2466-4cf6-9cca-a3258bdc8eba"); +// +// Form1099List response = forms1099Api.list1099Forms(request); +// Assertions.assertNotNull(response); +// Assertions.assertNotNull(response.getData()); +// } +// +// @Test +// void testListW9Forms() throws Exception { +// FormsW9Api.ListW9FormsRequest request = formsW9Api.getListW9FormsRequest(); +// request.setTop(10); +// request.setSkip(0); +// +// ListW9FormsResponse response = formsW9Api.listW9Forms(request); +// Assertions.assertNotNull(response); +// Assertions.assertNotNull(response.getValue()); +// } } diff --git a/src/test/java/Avalara/SDK/api/ApiClientHelperTest.java b/src/test/java/Avalara/SDK/api/ApiClientHelperTest.java index 2c411a2..0b02bf0 100644 --- a/src/test/java/Avalara/SDK/api/ApiClientHelperTest.java +++ b/src/test/java/Avalara/SDK/api/ApiClientHelperTest.java @@ -23,12 +23,12 @@ import Avalara.SDK.*; import io.github.cdimascio.dotenv.Dotenv; import org.jetbrains.annotations.NotNull; -import org.junit.Assert; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; -public class ApiClientHelperTest { - private Configuration configuration; +class ApiClientHelperTest { + private final Configuration configuration; public ApiClientHelperTest() { configuration = getConfiguration(); @@ -49,21 +49,21 @@ private Configuration getConfiguration() { @Test - @Ignore("Not currently supported") - public void verifyDeviceAuthorizationFlow() throws Exception { + @Disabled("Not currently supported") + void verifyDeviceAuthorizationFlow() throws Exception { DeviceAuthResponse response = ApiClientHelper.initiateDeviceAuthorizationOAuth(null, configuration); DeviceAccessTokenResponse tokenResponse = ApiClientHelper.getAccessTokenForDeviceFlow(response.getDeviceCode(), configuration); - Assert.assertEquals(tokenResponse.getErrorMessage(),"authorization_pending"); + Assertions.assertEquals("authorization_pending", tokenResponse.getErrorMessage()); } @Test - @Ignore("For this test to run, you need to authenticate manually using user code by pausing the flow at line 145 and then proceed") - public void verifyRefreshTokenFlow() throws Exception { + @Disabled("For this test to run, you need to authenticate manually using user code by pausing the flow at line 145 and then proceed") + void verifyRefreshTokenFlow() throws Exception { DeviceAuthResponse response = ApiClientHelper.initiateDeviceAuthorizationOAuth(null, configuration); DeviceAccessTokenResponse tokenResponse = ApiClientHelper.getAccessTokenForDeviceFlow(response.getDeviceCode(), configuration); String refreshToken = tokenResponse.getRefreshToken(); tokenResponse = ApiClientHelper.getAccessTokenUsingRefreshTokenForDeviceCodeFlow(refreshToken, configuration); - Assert.assertNotNull(tokenResponse.getIdToken()); - Assert.assertNotNull(tokenResponse.getAccessToken()); + Assertions.assertNotNull(tokenResponse.getIdToken()); + Assertions.assertNotNull(tokenResponse.getAccessToken()); } } \ No newline at end of file diff --git a/src/test/java/Avalara/SDK/api/EInvoicing/V1/DocumentsApiTest.java b/src/test/java/Avalara/SDK/api/EInvoicing/V1/DocumentsApiTest.java new file mode 100644 index 0000000..4be5277 --- /dev/null +++ b/src/test/java/Avalara/SDK/api/EInvoicing/V1/DocumentsApiTest.java @@ -0,0 +1,141 @@ +package Avalara.SDK.api.EInvoicing.V1; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching; + +import Avalara.SDK.ApiClient; +import Avalara.SDK.ApiResponse; +import Avalara.SDK.AvaTaxEnvironment; +import Avalara.SDK.Configuration; +import Avalara.SDK.api.EInvoicing.V1.DocumentsApi.DownloadDocumentRequest; +import com.github.tomakehurst.wiremock.client.MappingBuilder; +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder; +import com.github.tomakehurst.wiremock.client.WireMock; +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; +import com.github.tomakehurst.wiremock.junit5.WireMockTest; +import com.google.gson.reflect.TypeToken; +import java.io.File; +import java.util.List; +import okhttp3.Call; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import wiremock.org.apache.commons.io.FileUtils; + +@WireMockTest +class DocumentsApiTest { + + + public static final byte[] RESPONSE_CONTENT = "Example".getBytes(); + public static final String TRANSACTION_ID = "transactionId"; + public static final String X_AVALARA_CLIENT = "X_AVALARA_CLIENT"; + public static final String AVALARA_VERSION = "1.3"; + public static final String CONTENT_TYPE = "Content-Type"; + + @Test + void shouldDownloadDocumentWithoutInputCheckAndNoAcceptHeaderDefined(WireMockRuntimeInfo wireMockRuntimeInfo) throws Exception { + // given + // setup wiremock + String contentType = "application/json"; + setUpWiremock_OkWithAcceptedHeader(contentType); + + // create documentApi + DocumentsApi documentsApi = setupDocumentApi(wireMockRuntimeInfo); + + // when + DownloadDocumentRequest request = documentsApi.getDownloadDocumentRequest(); + request.setDocumentId(TRANSACTION_ID); + request.setXAvalaraClient(X_AVALARA_CLIENT); + request.setAvalaraVersion(AVALARA_VERSION); + Call call = documentsApi.downloadDocumentCall(request, null); + ApiResponse fileApiResponse = documentsApi.getApiClient().execute(call, new TypeToken() {}.getType()); + + + // then + Assertions.assertEquals(200, fileApiResponse.getStatusCode()); + Assertions.assertEquals(List.of(contentType), fileApiResponse.getHeaders().get(CONTENT_TYPE)); + File file = fileApiResponse.getData(); + byte[] bytes = FileUtils.readFileToByteArray(file); + Assertions.assertArrayEquals(RESPONSE_CONTENT, bytes); + } + + + @Test + void shouldDownloadDocumentWithHttpInfoAsPdf(WireMockRuntimeInfo wireMockRuntimeInfo) throws Exception { + // given + // setup wiremock + String contentType = "application/pdf"; + setUpWiremock_OkWithAcceptedHeader(contentType); + + // create documentApi + DocumentsApi documentsApi = setupDocumentApi(wireMockRuntimeInfo); + + // when + DownloadDocumentRequest request = documentsApi.getDownloadDocumentRequest(); + request.setDocumentId(TRANSACTION_ID); + request.setXAvalaraClient(X_AVALARA_CLIENT); + request.setAvalaraVersion(AVALARA_VERSION); + request.setAccept(contentType); + ApiResponse fileApiResponse = documentsApi.downloadDocumentWithHttpInfo(request); + + // then + Assertions.assertEquals(200, fileApiResponse.getStatusCode()); + Assertions.assertEquals(List.of(contentType), fileApiResponse.getHeaders().get(CONTENT_TYPE)); + File file = fileApiResponse.getData(); + byte[] bytes = FileUtils.readFileToByteArray(file); + Assertions.assertArrayEquals(RESPONSE_CONTENT, bytes); + } + + @Test + void shouldDownloadDocumentWithHttpInfoAsXml(WireMockRuntimeInfo wireMockRuntimeInfo) throws Exception { + // given + // setup wiremock + String contentType = "application/xml"; + setUpWiremock_OkWithAcceptedHeader(contentType); + + // create documentApi + DocumentsApi documentsApi = setupDocumentApi(wireMockRuntimeInfo); + + // when + DownloadDocumentRequest request = documentsApi.getDownloadDocumentRequest(); + request.setDocumentId(TRANSACTION_ID); + request.setXAvalaraClient(X_AVALARA_CLIENT); + request.setAvalaraVersion(AVALARA_VERSION); + request.setAccept(contentType); + ApiResponse fileApiResponse = documentsApi.downloadDocumentWithHttpInfo(request); + + // then + Assertions.assertEquals(200, fileApiResponse.getStatusCode()); + Assertions.assertEquals(List.of(contentType), fileApiResponse.getHeaders().get(CONTENT_TYPE)); + File file = fileApiResponse.getData(); + byte[] bytes = FileUtils.readFileToByteArray(file); + Assertions.assertArrayEquals(RESPONSE_CONTENT, bytes); + } + + private static DocumentsApi setupDocumentApi(WireMockRuntimeInfo wireMockRuntimeInfo) throws Exception { + String httpBaseUrl = wireMockRuntimeInfo.getHttpBaseUrl(); + Configuration configuration = new Configuration(); + String bearerToken = "BearerToken"; + configuration.setBearerToken(bearerToken); + configuration.setAppName("AppName"); + configuration.setAppVersion("1.0"); + configuration.setMachineName("MachineName"); + configuration.setTimeout(20000); + configuration.setEnvironment(AvaTaxEnvironment.Test); + configuration.setTokenUrl(httpBaseUrl); + configuration.setTestBasePath(httpBaseUrl); + ApiClient apiClient = new ApiClient(configuration); + DocumentsApi documentsApi = new DocumentsApi(apiClient); + return documentsApi; + } + + private static void setUpWiremock_OkWithAcceptedHeader(String contentType) { + MappingBuilder mappingBuilder = WireMock.get(urlPathMatching("/einvoicing/documents/transactionId/\\$download")) + .withHeader("Accept", equalTo(contentType)); + ResponseDefinitionBuilder responseBuilder = aResponse().withStatus(200) + .withHeader(CONTENT_TYPE, contentType) + .withBody(RESPONSE_CONTENT); + stubFor(mappingBuilder.willReturn(responseBuilder)); + } +} \ No newline at end of file diff --git a/src/test/java/Avalara/SDK/api/EInvoicing/V1/EInvoicingTest.java b/src/test/java/Avalara/SDK/api/EInvoicing/V1/EInvoicingTest.java index 2e1a00e..7f91269 100644 --- a/src/test/java/Avalara/SDK/api/EInvoicing/V1/EInvoicingTest.java +++ b/src/test/java/Avalara/SDK/api/EInvoicing/V1/EInvoicingTest.java @@ -25,13 +25,13 @@ import Avalara.SDK.model.EInvoicing.V1.MandatesResponse; import io.github.cdimascio.dotenv.Dotenv; import org.jetbrains.annotations.NotNull; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; /** * API tests for UtilitiesApi */ -public class EInvoicingTest { +class EInvoicingTest { private Configuration configuration; public EInvoicingTest() { @@ -52,20 +52,20 @@ private Configuration getConfiguration() { } @Test - public void testGetDocuments() throws Exception { + void testGetDocuments() throws Exception { ApiClient apiClient = new ApiClient(configuration); Avalara.SDK.api.EInvoicing.V1.DocumentsApi apiInstance = new DocumentsApi(apiClient); DocumentsApi.GetDocumentListRequest request = apiInstance.getGetDocumentListRequest(); DocumentListResponse result = apiInstance.getDocumentList(request); - Assert.assertNotNull(result); + Assertions.assertNotNull(result); } @Test - public void testGetMandates() throws Exception { + void testGetMandates() throws Exception { ApiClient apiClient = new ApiClient(configuration); Avalara.SDK.api.EInvoicing.V1.MandatesApi apiInstance = new MandatesApi(apiClient); MandatesApi.GetMandatesRequest request = apiInstance.getGetMandatesRequest(); MandatesResponse result = apiInstance.getMandates(request); - Assert.assertNotNull(result.getValue()); + Assertions.assertNotNull(result.getValue()); } } \ No newline at end of file