diff --git a/README.md b/README.md index 05949e9..46fba1b 100644 --- a/README.md +++ b/README.md @@ -45,10 +45,11 @@ const options = { } // Set custom parameters for the email validation request. -api.email +api.email() .setCustomId("CustomRequestID") // Sets a custom request ID. .setClientIP("127.0.0.1") // Sets the client IP address. .setClientCountry("CZ") // Sets the client country code. + .includeRequestDetails(true) // Returns the request in API response .setOptions(options) .validate(query) // Sends request to Foxentry API and performs email validation. .then((res: Response): void => { @@ -72,7 +73,6 @@ It offers the following methods: |-----------------------|------------------|----------------------------------------------| | setAuth | `API key` | Sets API key, that will be used in requests | | setApiVersion | `version number` | Sets specific API version, that will be used | -| includeRequestDetails | `true/false` | Includes request details with every request | To access various resources from this class, simply provide the resource name, and you will be able to access the resource's methods, e.g., `api.email.search(query)`, `api.company.get(query)`, etc. @@ -117,4 +117,4 @@ Response class is returned with every request providing methods below: ## Testing -The library includes unit tests to ensure its functionality and provide examples of how the library can be used. You can run the tests using Jest. Don't forget to set your API key for these tests, located in the \test\config.ts file. \ No newline at end of file +The library includes unit tests to ensure its functionality and provide examples of how the library can be used. You can run the tests using Jest. Don't forget to set your API key for these tests, located in the \test\config.ts file. diff --git a/package-lock.json b/package-lock.json index f630c0b..985f77a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,16 @@ { "name": "@foxentry/js-sdk", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@foxentry/js-sdk", - "version": "1.0.0", + "version": "1.1.0", "license": "MIT", "dependencies": { - "axios": "^1.6.8" + "axios": ">=1.7.5", + "ipaddr.js": "^2.2.0" }, "devDependencies": { "@types/jest": "^29.5.12", @@ -3558,9 +3559,10 @@ } }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz", + "integrity": "sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -6048,6 +6050,15 @@ "node": ">= 0.4" } }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", diff --git a/package.json b/package.json index ec9f3a4..424bf09 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@foxentry/js-sdk", - "version": "1.0.3", + "version": "1.1.0", "main": "dist/index.js", "module": "dist/index.m.js", "unpkg": "dist/index.umd.js", @@ -41,6 +41,7 @@ "ts-jest": "^29.1.2" }, "dependencies": { - "axios": "^1.6.8" + "axios": "^1.7.5", + "ipaddr.js": "^2.2.0" } } diff --git a/src/ApiClient.ts b/src/ApiClient.ts index f800b06..92fc118 100644 --- a/src/ApiClient.ts +++ b/src/ApiClient.ts @@ -11,91 +11,80 @@ import Phone from './Resource/Phone'; */ export default class ApiClient { /** - * Email resource. + * Api key */ - public email: Email; + private apiKey: string | null = null; /** - * Location resource. + * Api version */ - public location: Location; + private apiVersion: string = '2.0'; /** - * Company resource. + * ApiClient constructor. + * @param apiKey The API key for authentication */ - public company: Company; + constructor(apiKey: string | null = null) { + this.apiKey = apiKey; + } /** - * Name resource. + * Email resource. */ - public name: Name; + public email(): Email { + const request = new Request(this.apiVersion, this.apiKey); + return new Email(request); + } /** - * Phone resource. + * Location resource. */ - public phone: Phone; + public location(): Location { + const request = new Request(this.apiVersion, this.apiKey); + return new Location(request); + } /** - * Request object for making API requests. + * Company resource. */ - private request: Request; + public company(): Company { + const request = new Request(this.apiVersion, this.apiKey); + return new Company(request); + } /** - * ApiClient constructor. - * @param apiKey The API key for authentication + * Name resource. */ - constructor(apiKey: string | null = null) { - this.request = new Request(); - - if (apiKey) { - this.request.setAuth(apiKey); - } - - this.company = new Company(this.request); - this.email = new Email(this.request); - this.location = new Location(this.request); - this.name = new Name(this.request); - this.phone = new Phone(this.request); + public name(): Name { + const request = new Request(this.apiVersion, this.apiKey); + return new Name(request); } /** - * Sets the base URL for API requests. - * - * @param {string} url - The base URL to set. - * @return {ApiClient} + * Phone resource. */ - public setBaseURL(url: string): ApiClient { - this.request.setBaseURL(url); - return this; + public phone(): Phone { + const request = new Request(this.apiVersion, this.apiKey); + return new Phone(request); } /** * Set API key for authentication. * @param apiKey The API key to set - * @return {ApiClient} + * @return {ApiClient} */ public setAuth(apiKey: string): ApiClient { - this.request.setAuth(apiKey); + this.apiKey = apiKey; return this; } /** * Set the API version for requests. * @param version The API version to set - * @return {ApiClient} + * @return {ApiClient} */ public setApiVersion(version: string): ApiClient { - this.request.setHeader("Api-Version", version); - return this; - } - - /** - * Include request details in API responses. - * @param value Whether to include request details (default: true) - * @return {ApiClient} - */ - public includeRequestDetails(value: boolean = true): ApiClient { - this.request.setHeader("Foxentry-Include-Request-Details", value); + this.apiVersion = version; return this; } -} \ No newline at end of file +} diff --git a/src/Request.ts b/src/Request.ts index c5dd8a6..d8c39e3 100644 --- a/src/Request.ts +++ b/src/Request.ts @@ -1,5 +1,6 @@ -import { ExceptionBuilder } from './Exception/ExceptionBuilder'; -import axios, { Axios, AxiosResponse } from "axios"; +import { ExceptionBuilder } from './Exception/ExceptionBuilder' +import axios, { Axios, AxiosResponse } from 'axios' +import * as ipaddr from 'ipaddr.js'; /** * Request class for handling API requests. @@ -11,7 +12,7 @@ export default class Request { "Foxentry-Include-Request-Details": false, "Content-Type": "application/json", "Accept": "application/json", - "User-Agent": "sdk/javascript" + "User-Agent": "FoxentrySdk (JS/1.1.0; ApiReference/2.0)" }; private body: object | null = null; private customId: string | null = null; @@ -22,7 +23,13 @@ export default class Request { private apiKey: string = ""; private client: Record | null = null; - constructor() { + constructor(apiVersion: string, apiKey?: string|null) { + this.setHeader("Api-Version", apiVersion); + + if (apiKey){ + this.setAuth(apiKey); + } + this.httpClient = axios.create({ baseURL: this.baseUri }); @@ -49,17 +56,12 @@ export default class Request { this.options = options; } - public setBaseURL(url: string): void { - this.baseUri = url; - this.httpClient.defaults.baseURL = this.baseUri; - } - public setEndpoint(endpoint: string): void { this.endpoint = endpoint; } public setClientIP(ip: string): void { - if (!ip.match(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/)) { + if (!ipaddr.isValid(ip)) { throw new Error("The specified IP address is not valid."); } @@ -86,14 +88,12 @@ export default class Request { this.buildBody(); this.validate(); - const response = await this.httpClient.request({ + return await this.httpClient.request({ method: this.method, url: this.endpoint, headers: this.headers, data: JSON.stringify(this.body) - }) - - return response; + }); } catch (error: any) { if (error?.isAxiosError) throw ExceptionBuilder.fromRequestException(error); @@ -131,4 +131,4 @@ export default class Request { throw new Error("Request body is empty."); } } -} \ No newline at end of file +} diff --git a/src/Resource/BaseResource.ts b/src/Resource/BaseResource.ts index c885958..2873dc3 100644 --- a/src/Resource/BaseResource.ts +++ b/src/Resource/BaseResource.ts @@ -30,6 +30,16 @@ export default abstract class BaseResource { this.request = request; } + /** + * Include request details in API responses. + * @param value Whether to include request details (default: true) + * @return {ApiClient} + */ + public includeRequestDetails(value: boolean = true): this { + this.request.setHeader("Foxentry-Include-Request-Details", value); + return this; + } + /** * Sets a custom ID for the resource. * @@ -89,11 +99,11 @@ export default abstract class BaseResource { /** * Sends a request to the specified endpoint with the given query parameters. * - * @param {Record} query - The query parameters to send with the request. * @param {string} endpoint - The endpoint to call e.g. "email/validate". + * @param {Record} query - The query parameters to send with the request. * @return {Promise} A promise that resolves to the response from the request. */ - protected async send(query: Record, endpoint: Endpoint): Promise { + protected async send(endpoint: Endpoint, query: Record): Promise { this.request.setEndpoint(endpoint); this.request.setQuery(query); const r = await this.request.send() diff --git a/src/Resource/Company.ts b/src/Resource/Company.ts index 373d2c7..4bfa60b 100644 --- a/src/Resource/Company.ts +++ b/src/Resource/Company.ts @@ -13,7 +13,7 @@ export default class Company extends BaseResource { * @returns A promise resolving to the response from the validation request */ public validate(query: Record): Promise { - return super.send(query, Endpoint.CompanyValidate); + return super.send(Endpoint.CompanyValidate, query); } /** @@ -24,7 +24,7 @@ export default class Company extends BaseResource { * @returns A promise resolving to the response from the API */ public search(query: Record): Promise { - return super.send(query, Endpoint.CompanySearch); + return super.send(Endpoint.CompanySearch, query); } /** @@ -35,6 +35,6 @@ export default class Company extends BaseResource { * @returns A promise resolving to the response from the API */ public get(query: Record): Promise { - return super.send(query, Endpoint.CompanyGet); + return super.send(Endpoint.CompanyGet, query); } } diff --git a/src/Resource/Email.ts b/src/Resource/Email.ts index 687a147..3e5279d 100644 --- a/src/Resource/Email.ts +++ b/src/Resource/Email.ts @@ -14,7 +14,7 @@ export default class Email extends BaseResource { */ public validate(query: string | Record): Promise { const emailQuery = typeof query === 'string' ? { email: query } : query; - return super.send(emailQuery, Endpoint.EmailValidate); + return super.send(Endpoint.EmailValidate, emailQuery); } @@ -26,6 +26,6 @@ export default class Email extends BaseResource { */ public search(query: string | Record): Promise { const searchQuery = typeof query === 'string' ? { value: query } : query; - return super.send(searchQuery, Endpoint.EmailSearch); + return super.send(Endpoint.EmailSearch, searchQuery); } -} \ No newline at end of file +} diff --git a/src/Resource/Location.ts b/src/Resource/Location.ts index ac9a95e..3c3c5d7 100644 --- a/src/Resource/Location.ts +++ b/src/Resource/Location.ts @@ -13,7 +13,7 @@ export default class Location extends BaseResource { * @returns A promise resolving to the response from the validation request */ public validate(query: Record): Promise { - return super.send(query, Endpoint.LocationValidate); + return super.send(Endpoint.LocationValidate, query); } /** @@ -24,7 +24,7 @@ export default class Location extends BaseResource { * @returns A promise resolving to the response from the API */ public search(query: Record): Promise { - return super.send(query, Endpoint.LocationSearch); + return super.send(Endpoint.LocationSearch, query); } /** @@ -35,7 +35,7 @@ export default class Location extends BaseResource { * @returns A promise resolving to the response from the API */ public get(query: Record): Promise { - return super.send(query, Endpoint.LocationGet); + return super.send(Endpoint.LocationGet, query); } /** @@ -46,6 +46,6 @@ export default class Location extends BaseResource { * @returns A promise resolving to the response from the API */ public localize(query: Record): Promise { - return super.send(query, Endpoint.LocationLocalize); + return super.send(Endpoint.LocationLocalize, query); } } diff --git a/src/Resource/Name.ts b/src/Resource/Name.ts index 83fe84d..5b96d8c 100644 --- a/src/Resource/Name.ts +++ b/src/Resource/Name.ts @@ -13,6 +13,6 @@ export default class Name extends BaseResource { * @returns The response from the validation request */ public validate(query: Record): Promise { - return super.send(query, Endpoint.NameValidate); + return super.send(Endpoint.NameValidate, query); } } diff --git a/src/Resource/Phone.ts b/src/Resource/Phone.ts index 7844f48..1b35ebe 100644 --- a/src/Resource/Phone.ts +++ b/src/Resource/Phone.ts @@ -13,6 +13,6 @@ export default class Phone extends BaseResource { * @returns The response from the validation request */ public validate(query: Record): Promise { - return super.send(query, Endpoint.PhoneValidate); + return super.send(Endpoint.PhoneValidate, query); } } diff --git a/test/Company/CompanyGet.test.ts b/test/Company/CompanyGet.test.ts index 65ffc8e..ee0a6c3 100644 --- a/test/Company/CompanyGet.test.ts +++ b/test/Company/CompanyGet.test.ts @@ -21,7 +21,7 @@ describe('Company Get', () => { dataScope: 'basic' }; - const response: Response = await api.company.setOptions(options).get(query); + const response: Response = await api.company().setOptions(options).get(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -39,7 +39,7 @@ describe('Company Get', () => { dataScope: 'extended' }; - const response: Response = await api.company.setOptions(options).get(query); + const response: Response = await api.company().setOptions(options).get(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -57,7 +57,7 @@ describe('Company Get', () => { dataScope: 'full' }; - const response: Response = await api.company.setOptions(options).get(query); + const response: Response = await api.company().setOptions(options).get(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -76,7 +76,7 @@ describe('Company Get', () => { dataScope: 'basic' }; - const response: Response = await api.company + const response: Response = await api.company() .setCustomId(customRequestId) .setOptions(options) .get(query); @@ -98,7 +98,7 @@ describe('Company Get', () => { dataScope: 'basic' }; - const response: Response = await api.company + const response: Response = await api.company() .setOptions(options) .setClientCountry('CZ') .setClientIP('127.0.0.1') @@ -111,4 +111,28 @@ describe('Company Get', () => { expect(response.getStatus()).toBe(200); expect(result[0]?.data).toBeTruthy(); }); + + test("settings should not persist between calls", async () => { + const query = { + country: 'CZ', + registrationNumber: '04997476' + }; + + const options = { + dataScope: 'basic' + }; + + const response: Response = await api.company() + .setOptions(options) + .includeRequestDetails(true) + .get(query); + const result = response.getRequest(); + expect(result.query).not.toBeUndefined(); + + const secondResponse: Response = await api.company() + .setOptions(options) + .get(query); + const secondResult = secondResponse.getRequest(); + expect(secondResult.query).toBeUndefined(); + }); }); diff --git a/test/Company/CompanySearch.test.ts b/test/Company/CompanySearch.test.ts index 9336dc4..42cfc8e 100644 --- a/test/Company/CompanySearch.test.ts +++ b/test/Company/CompanySearch.test.ts @@ -21,7 +21,7 @@ describe('Company Search', () => { resultsLimit: 10 }; - const response: Response = await api.company.setOptions(options).search(query); + const response: Response = await api.company().setOptions(options).search(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -41,7 +41,7 @@ describe('Company Search', () => { resultsLimit: 10 }; - const response: Response = await api.company.setOptions(options).search(query); + const response: Response = await api.company().setOptions(options).search(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -61,7 +61,7 @@ describe('Company Search', () => { resultsLimit: 10 }; - const response: Response = await api.company.setOptions(options).search(query); + const response: Response = await api.company().setOptions(options).search(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -81,7 +81,7 @@ describe('Company Search', () => { resultsLimit: 10 }; - const response: Response = await api.company.setOptions(options).search(query); + const response: Response = await api.company().setOptions(options).search(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -103,7 +103,7 @@ describe('Company Search', () => { resultsLimit: 10 }; - const response: Response = await api.company + const response: Response = await api.company() .setCustomId(customRequestId) .setOptions(options) .search(query); @@ -127,7 +127,7 @@ describe('Company Search', () => { resultsLimit: 10 }; - const response: Response = await api.company + const response: Response = await api.company() .setOptions(options) .setClientCountry('CZ') .setClientIP('127.0.0.1') diff --git a/test/Company/CompanyValidate.test.ts b/test/Company/CompanyValidate.test.ts index 77e89f0..c2eac46 100644 --- a/test/Company/CompanyValidate.test.ts +++ b/test/Company/CompanyValidate.test.ts @@ -21,7 +21,7 @@ describe('Company Validate', () => { dataScope: 'basic' }; - const response: Response = await api.company.setOptions(options).validate(query); + const response: Response = await api.company().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -41,7 +41,7 @@ describe('Company Validate', () => { dataScope: 'basic' }; - const response: Response = await api.company.setOptions(options).validate(query); + const response: Response = await api.company().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -61,7 +61,7 @@ describe('Company Validate', () => { dataScope: 'basic' }; - const response: Response = await api.company.setOptions(options).validate(query); + const response: Response = await api.company().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -80,7 +80,7 @@ describe('Company Validate', () => { dataScope: 'basic' }; - const response: Response = await api.company.setOptions(options).validate(query); + const response: Response = await api.company().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -102,7 +102,7 @@ describe('Company Validate', () => { dataScope: 'basic' }; - const response: Response = await api.company + const response: Response = await api.company() .setCustomId(customRequestId) .setOptions(options) .validate(query); @@ -124,7 +124,7 @@ describe('Company Validate', () => { dataScope: 'basic' }; - const response: Response = await api.company + const response: Response = await api.company() .setOptions(options) .setClientCountry('CZ') .setClientIP('127.0.0.1') diff --git a/test/Email/EmailSearch.test.ts b/test/Email/EmailSearch.test.ts index 2bcb75c..fc2127e 100644 --- a/test/Email/EmailSearch.test.ts +++ b/test/Email/EmailSearch.test.ts @@ -24,7 +24,7 @@ describe('Email Search', () => { }; // Perform email search. - const response: Response = await api.email.setOptions(options).search(input); + const response: Response = await api.email().setOptions(options).search(input); const result = response.getResult(); // Assertions. @@ -50,7 +50,7 @@ describe('Email Search', () => { }; // Perform email validation. - const response: Response = await api.email.setOptions(options).search(query); + const response: Response = await api.email().setOptions(options).search(query); // Assertions. expect(response).toBeInstanceOf(Response); diff --git a/test/Email/EmailValidate.test.ts b/test/Email/EmailValidate.test.ts index e52ec18..f46b6ae 100644 --- a/test/Email/EmailValidate.test.ts +++ b/test/Email/EmailValidate.test.ts @@ -19,7 +19,7 @@ describe('Email Validate', () => { const emailToValidate = 'info@foxentry.com'; const options = { validationType: 'extended' }; // Set validation type to extended - const response: Response = await api.email.setOptions(options).validate(emailToValidate); + const response: Response = await api.email().setOptions(options).validate(emailToValidate); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -36,7 +36,7 @@ describe('Email Validate', () => { const emailToValidate = 'invalidUser@foxentry.com'; const options = { validationType: 'extended' }; // Set validation type to extended - const response: Response = await api.email.setOptions(options).validate(emailToValidate); + const response: Response = await api.email().setOptions(options).validate(emailToValidate); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -53,7 +53,7 @@ describe('Email Validate', () => { const emailToValidate = 'info@gmali.com'; const options = { validationType: 'extended' }; // Set validation type to extended - const response: Response = await api.email.setOptions(options).validate(emailToValidate); + const response: Response = await api.email().setOptions(options).validate(emailToValidate); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -70,7 +70,7 @@ describe('Email Validate', () => { const emailToValidate = 'info@foxentry,com'; // Comma instead of dot const options = { validationType: 'extended' }; // Set validation type to extended - const response: Response = await api.email.setOptions(options).validate(emailToValidate); + const response: Response = await api.email().setOptions(options).validate(emailToValidate); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -87,7 +87,7 @@ describe('Email Validate', () => { const emailToValidate = 'infogmail.com'; // Missing "@" symbol const options = { validationType: 'extended' }; // Set validation type to extended - const response: Response = await api.email.setOptions(options).validate(emailToValidate); + const response: Response = await api.email().setOptions(options).validate(emailToValidate); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -104,7 +104,7 @@ describe('Email Validate', () => { const emailToValidate = 'rasini3451@naymedia.com'; const options = { acceptDisposableEmails: false }; // Disposable emails not accepted - const response: Response = await api.email.setOptions(options).validate(emailToValidate); + const response: Response = await api.email().setOptions(options).validate(emailToValidate); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -122,7 +122,7 @@ describe('Email Validate', () => { const emailToValidate = 'info@gmail.com'; const options = { acceptFreemails: false }; // Freemails not accepted - const response: Response = await api.email.setOptions(options).validate(emailToValidate); + const response: Response = await api.email().setOptions(options).validate(emailToValidate); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -140,7 +140,7 @@ describe('Email Validate', () => { const customRequestId = 'orderEmailValidation'; // Set custom request ID const emailToValidate = 'info@foxentry.com'; - const response: Response = await api.email.setCustomId(customRequestId).validate(emailToValidate); + const response: Response = await api.email().setCustomId(customRequestId).validate(emailToValidate); const request = response.getRequest(); expect(response).toBeInstanceOf(Response); @@ -154,7 +154,7 @@ describe('Email Validate', () => { test('email with client information', async () => { const emailToValidate = 'info@foxentry.com'; - const response: Response = await api.email + const response: Response = await api.email() .setClientCountry('CZ') .setClientIP('127.0.0.1') .setClientLocation(50.073658, 14.418540) @@ -174,7 +174,7 @@ describe('Email Validate', () => { const query = { email: 'info@foxentry.com' }; // Set query as input const options = { validationType: 'extended' }; // Set validation type to extended - const response: Response = await api.email.setOptions(options).validate(query); + const response: Response = await api.email().setOptions(options).validate(query); expect(response).toBeInstanceOf(Response); expect(response.getStatus()).toBe(200); @@ -187,7 +187,7 @@ describe('Email Validate', () => { const emailToValidate = 'info@foxentry.com'; const options = { validationType: 'extended' };// Set validation type to extended - const response: Response = await api.email.setOptions(options).validate(emailToValidate) + const response: Response = await api.email().setOptions(options).validate(emailToValidate) expect(response).toBeInstanceOf(Response); expect(response.getStatus()).toBe(200); @@ -199,4 +199,17 @@ describe('Email Validate', () => { expect(response.getDailyCreditsLimit()).toBeDefined(); expect(response.getApiVersion()).toBeDefined(); }); -}); \ No newline at end of file + + test("settings should not persist between calls", async () => { + const response: Response = await api.email() + .includeRequestDetails(true) + .validate('info@foxentry.com'); + const result = response.getRequest(); + expect(result.query).not.toBeUndefined(); + + const secondResponse: Response = await api.email() + .validate('info@foxentry.com'); + const secondResult = secondResponse.getRequest(); + expect(secondResult.query).toBeUndefined(); + }); +}); diff --git a/test/Location/LocationGet.test.ts b/test/Location/LocationGet.test.ts index 4ba3db8..e5aaa21 100644 --- a/test/Location/LocationGet.test.ts +++ b/test/Location/LocationGet.test.ts @@ -22,7 +22,7 @@ describe('Location Get', () => { dataScope: 'full' }; - const response: Response = await api.location.setOptions(options).get(query); + const response: Response = await api.location().setOptions(options).get(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -41,7 +41,7 @@ describe('Location Get', () => { dataScope: 'full' }; - const response: Response = await api.location.setOptions(options).get(query); + const response: Response = await api.location().setOptions(options).get(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -62,7 +62,7 @@ describe('Location Get', () => { dataScope: 'full' }; - const response: Response = await api.location + const response: Response = await api.location() .setCustomId(customRequestId) .setOptions(options) .get(query); @@ -85,7 +85,7 @@ describe('Location Get', () => { dataScope: 'full' }; - const response: Response = await api.location + const response: Response = await api.location() .setOptions(options) .setClientCountry('CZ') .setClientIP('127.0.0.1') @@ -98,4 +98,29 @@ describe('Location Get', () => { expect(response.getStatus()).toBe(200); expect(result[0].data).toBeTruthy(); }); + + test("settings should not persist between calls", async () => { + const query = { + country: 'CZ', + id: '22349995' + }; + + const options = { + idType: 'external', + dataScope: 'basic' + }; + + const response: Response = await api.location() + .includeRequestDetails(true) + .setOptions(options) + .get(query); + const result = response.getRequest(); + expect(result.query).not.toBeUndefined(); + + const secondResponse: Response = await api.location() + .setOptions(options) + .get(query); + const secondResult = secondResponse.getRequest(); + expect(secondResult.query).toBeUndefined(); + }); }); diff --git a/test/Location/LocationLocalize.test.ts b/test/Location/LocationLocalize.test.ts index 858b1e4..7b81d8c 100644 --- a/test/Location/LocationLocalize.test.ts +++ b/test/Location/LocationLocalize.test.ts @@ -23,7 +23,7 @@ describe('Location Localize', () => { acceptNearest: false }; - const response: Response = await api.location.setOptions(options).localize(query); + const response: Response = await api.location().setOptions(options).localize(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -47,7 +47,7 @@ describe('Location Localize', () => { acceptNearest: false }; - const response: Response = await api.location + const response: Response = await api.location() .setCustomId(customRequestId) .setOptions(options) .localize(query); @@ -73,7 +73,7 @@ describe('Location Localize', () => { acceptNearest: false }; - const response: Response = await api.location + const response: Response = await api.location() .setOptions(options) .setClientCountry("CZ") .setClientIP("127.0.0.1") diff --git a/test/Location/LocationSearch.test.ts b/test/Location/LocationSearch.test.ts index 64d09b6..530c626 100644 --- a/test/Location/LocationSearch.test.ts +++ b/test/Location/LocationSearch.test.ts @@ -21,7 +21,7 @@ describe('Location Search', () => { resultsLimit: 10 }; - const response: Response = await api.location.setOptions(options).search(query); + const response: Response = await api.location().setOptions(options).search(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -41,7 +41,7 @@ describe('Location Search', () => { resultsLimit: 10 }; - const response: Response = await api.location.setOptions(options).search(query); + const response: Response = await api.location().setOptions(options).search(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -61,7 +61,7 @@ describe('Location Search', () => { resultsLimit: 10 }; - const response: Response = await api.location.setOptions(options).search(query); + const response: Response = await api.location().setOptions(options).search(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -81,7 +81,7 @@ describe('Location Search', () => { resultsLimit: 10 }; - const response: Response = await api.location.setOptions(options).search(query); + const response: Response = await api.location().setOptions(options).search(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -101,7 +101,7 @@ describe('Location Search', () => { resultsLimit: 10 }; - const response: Response = await api.location.setOptions(options).search(query); + const response: Response = await api.location().setOptions(options).search(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -123,7 +123,7 @@ describe('Location Search', () => { resultsLimit: 10 }; - const response: Response = await api.location + const response: Response = await api.location() .setCustomId(customRequestId) .setOptions(options) .search(query); @@ -147,7 +147,7 @@ describe('Location Search', () => { resultsLimit: 10 }; - const response: Response = await api.location + const response: Response = await api.location() .setOptions(options) .setClientCountry("CZ") .setClientIP("127.0.0.1") @@ -162,4 +162,4 @@ describe('Location Search', () => { expect(response.getResponse().resultsCount).toBeGreaterThan(0); expect(result).toBeTruthy(); }); -}); \ No newline at end of file +}); diff --git a/test/Location/LocationValidate.test.ts b/test/Location/LocationValidate.test.ts index 21d986e..f6638f5 100644 --- a/test/Location/LocationValidate.test.ts +++ b/test/Location/LocationValidate.test.ts @@ -24,7 +24,7 @@ describe('Location Validate', () => { zipFormat: true }; - const response: Response = await api.location.setOptions(options).validate(query); + const response: Response = await api.location().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -47,7 +47,7 @@ describe('Location Validate', () => { zipFormat: true }; - const response: Response = await api.location.setOptions(options).validate(query); + const response: Response = await api.location().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -70,7 +70,7 @@ describe('Location Validate', () => { zipFormat: true }; - const response: Response = await api.location.setOptions(options).validate(query); + const response: Response = await api.location().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -93,7 +93,7 @@ describe('Location Validate', () => { zipFormat: true }; - const response: Response = await api.location.setOptions(options).validate(query); + const response: Response = await api.location().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -118,7 +118,7 @@ describe('Location Validate', () => { zipFormat: true }; - const response: Response = await api.location + const response: Response = await api.location() .setCustomId(customRequestId) .setOptions(options) .validate(query); @@ -143,7 +143,7 @@ describe('Location Validate', () => { zipFormat: true }; - const response: Response = await api.location + const response: Response = await api.location() .setOptions(options) .setClientCountry("CZ") .setClientIP("127.0.0.1") diff --git a/test/Name/NameValidate.test.ts b/test/Name/NameValidate.test.ts index 09d971b..a26734f 100644 --- a/test/Name/NameValidate.test.ts +++ b/test/Name/NameValidate.test.ts @@ -20,7 +20,7 @@ describe('Name Validate', () => { dataScope: "basic" }; - const response: Response = await api.name.setOptions(options).validate(query); + const response: Response = await api.name().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -40,7 +40,7 @@ describe('Name Validate', () => { validationDepth: "strict" }; - const response: Response = await api.name.setOptions(options).validate(query); + const response: Response = await api.name().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -60,7 +60,7 @@ describe('Name Validate', () => { validationDepth: "strict" }; - const response: Response = await api.name.setOptions(options).validate(query); + const response: Response = await api.name().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -79,7 +79,7 @@ describe('Name Validate', () => { dataScope: "full" }; - const response: Response = await api.name.setOptions(options).validate(query); + const response: Response = await api.name().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -96,7 +96,7 @@ describe('Name Validate', () => { name: "Pavel" }; - const response: Response = await api.name + const response: Response = await api.name() .setCustomId(customRequestId) .validate(query); @@ -116,7 +116,7 @@ describe('Name Validate', () => { dataScope: "basic" }; - const response: Response = await api.name + const response: Response = await api.name() .setOptions(options) .setClientCountry("CZ") .setClientIP("127.0.0.1") @@ -129,4 +129,21 @@ describe('Name Validate', () => { expect(response.getStatus()).toBe(200); expect(result.isValid).toBe(true); }); + + test("settings should not persist between calls", async () => { + const query = { + name: "Pavel" + }; + + const response: Response = await api.name() + .includeRequestDetails(true) + .validate(query); + const result = response.getRequest(); + expect(result.query).not.toBeUndefined(); + + const secondResponse: Response = await api.name() + .validate(query); + const secondResult = secondResponse.getRequest(); + expect(secondResult.query).toBeUndefined(); + }); }); diff --git a/test/Phone/PhoneValidate.test.ts b/test/Phone/PhoneValidate.test.ts index 4241f35..53b9bf7 100644 --- a/test/Phone/PhoneValidate.test.ts +++ b/test/Phone/PhoneValidate.test.ts @@ -20,7 +20,7 @@ describe('Phone Validate', () => { validationType: "extended" }; - const response: Response = await api.phone.setOptions(options).validate(query); + const response: Response = await api.phone().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -39,7 +39,7 @@ describe('Phone Validate', () => { validationType: "extended" }; - const response: Response = await api.phone.setOptions(options).validate(query); + const response: Response = await api.phone().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -59,7 +59,7 @@ describe('Phone Validate', () => { validationType: "extended" }; - const response: Response = await api.phone.setOptions(options).validate(query); + const response: Response = await api.phone().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -79,7 +79,7 @@ describe('Phone Validate', () => { validationType: "extended" }; - const response: Response = await api.phone.setOptions(options).validate(query); + const response: Response = await api.phone().setOptions(options).validate(query); const result = response.getResult(); expect(response).toBeInstanceOf(Response); @@ -96,7 +96,7 @@ describe('Phone Validate', () => { numberWithPrefix: "+420607123456" }; - const response: Response = await api.phone + const response: Response = await api.phone() .setCustomId(customRequestId) .validate(query); @@ -112,7 +112,7 @@ describe('Phone Validate', () => { numberWithPrefix: "+420607123456" }; - const response: Response = await api.phone + const response: Response = await api.phone() .setClientCountry("CZ") .setClientIP("127.0.0.1") .setClientLocation(50.073658, 14.418540) @@ -124,4 +124,21 @@ describe('Phone Validate', () => { expect(response.getStatus()).toBe(200); expect(result.isValid).toBe(true); }); -}); \ No newline at end of file + + test("settings should not persist between calls", async () => { + const query = { + numberWithPrefix: "+420607123456" + }; + + const response: Response = await api.phone() + .includeRequestDetails(true) + .validate(query); + const result = response.getRequest(); + expect(result.query).not.toBeUndefined(); + + const secondResponse: Response = await api.phone() + .validate(query); + const secondResult = secondResponse.getRequest(); + expect(secondResult.query).toBeUndefined(); + }); +}); diff --git a/test/Request.test.ts b/test/Request.test.ts new file mode 100644 index 0000000..c921603 --- /dev/null +++ b/test/Request.test.ts @@ -0,0 +1,31 @@ +import { ApiClient } from "../src/index"; + +/** + * Tests for base request + */ +describe('Request', () => { + let api: ApiClient; + + beforeAll(() => { + const apiKey = process.env.API_KEY; // API key needs to be set in the test/config.ts file + api = new ApiClient(apiKey); + }); + + test("test ip validation", async () => { + expect(() => api.location() + .setClientIP('127.0.0.1') + ).not.toThrow(); + + expect(() => api.location() + .setClientIP('999.0.0.1') + ).toThrow(); + + expect(() => api.location() + .setClientIP('::1') + ).not.toThrow(); + + expect(() => api.location() + .setClientIP('2001:db8:a0b:12f0::::0:1') + ).toThrow(); + }); +});