diff --git a/README.md b/README.md index b389b35..f00f83f 100644 --- a/README.md +++ b/README.md @@ -83,9 +83,9 @@ pnpm add @strapi/sdk-js To interact with your Strapi backend, initialize the SDK with your Strapi API base URL: ```typescript -import { strapiSDK } from '@strapi/sdk-js'; +import { strapi } from '@strapi/sdk-js'; -const sdk = strapiSDK({ baseURL: 'http://localhost:1337/api' }); +const sdk = strapi({ baseURL: 'http://localhost:1337/api' }); ``` Alternatively, use a ` ``` @@ -107,7 +107,7 @@ The SDK supports multiple authentication strategies for accessing authenticated If your Strapi instance uses API tokens, configure the SDK like this: ```typescript -const sdk = strapiSDK({ +const sdk = strapi({ baseURL: 'http://localhost:1337/api', auth: { strategy: 'api-token', @@ -230,25 +230,25 @@ For **browser environments**, debug capabilities are intentionally turned off to The `debug` tool allows you to control logs using wildcard patterns (`*`): - `*`: enable all logs. -- `sdk:module`: enable logs for a specific module. -- `sdk:module1,sdk:module2`: enable logs for multiple modules. -- `sdk:*`: match all namespaces under `sdk`. -- `sdk:*,-sdk:module2`: enable all logs except those from `sdk:module2`. +- `strapi:module`: enable logs for a specific module. +- `strapi:module1,sdk:module2`: enable logs for multiple modules. +- `strapi:*`: match all namespaces under `strapi`. +- `strapi:*,-strapi:module2`: enable all logs except those from `strapi:module2`. ### Namespaces Below is a list of available namespaces to use: -| Namespace | Description | -| ------------------------------------- | ----------------------------------------------------------------------------------------- | -| `sdk:core` | Logs SDK initialization, configuration validation, and HTTP client setup. | -| `sdk:validators:sdk` | Logs details related to SDK configuration validation. | -| `sdk:validators:url` | Logs URL validation processes. | -| `sdk:http` | Logs HTTP client setup, request processing, and response/error handling. | -| `sdk:auth:factory` | Logs the registration and creation of authentication providers. | -| `sdk:auth:manager` | Logs authentication lifecycle management. | -| `sdk:auth:provider:api-token` | Logs operations related to API token authentication. | -| `sdk:auth:provider:users-permissions` | Logs operations related to user and permissions-based authentication. | -| `sdk:ct:collection` | Logs interactions with collection-type content managers. | -| `sdk:ct:single` | Logs interactions with single-type content managers. | -| `sdk:utils:url-helper` | Logs URL helper utility operations (e.g., appending query parameters or formatting URLs). | +| Namespace | Description | +| ---------------------------------------- | ----------------------------------------------------------------------------------------- | +| `strapi:core` | Logs SDK initialization, configuration validation, and HTTP client setup. | +| `strapi:validators:config` | Logs details related to SDK configuration validation. | +| `strapi:validators:url` | Logs URL validation processes. | +| `strapi:http` | Logs HTTP client setup, request processing, and response/error handling. | +| `strapi:auth:factory` | Logs the registration and creation of authentication providers. | +| `strapi:auth:manager` | Logs authentication lifecycle management. | +| `strapi:auth:provider:api-token` | Logs operations related to API token authentication. | +| `strapi:auth:provider:users-permissions` | Logs operations related to user and permissions-based authentication. | +| `strapi:ct:collection` | Logs interactions with collection-type content managers. | +| `strapi:ct:single` | Logs interactions with single-type content managers. | +| `strapi:utils:url-helper` | Logs URL helper utility operations (e.g., appending query parameters or formatting URLs). | diff --git a/src/auth/factory/factory.ts b/src/auth/factory/factory.ts index 6d65e13..754d0dc 100644 --- a/src/auth/factory/factory.ts +++ b/src/auth/factory/factory.ts @@ -1,11 +1,11 @@ import createDebug from 'debug'; -import { StrapiSDKError } from '../../errors'; +import { StrapiError } from '../../errors'; import type { AuthProviderCreator, AuthProviderMap, CreateAuthProviderParams } from './types'; import type { AuthProvider } from '../providers'; -const debug = createDebug('sdk:auth:factory'); +const debug = createDebug('strapi:auth:factory'); /** * A factory class responsible for creating and managing authentication providers. @@ -26,7 +26,7 @@ export class AuthProviderFactory { * * @returns An instance of an AuthProvider initialized with the given options. * - * @throws {StrapiSDKError} Throws an error if the specified strategy is not registered in the factory. + * @throws {StrapiError} Throws an error if the specified strategy is not registered in the factory. * * @example * ```typescript @@ -48,7 +48,7 @@ export class AuthProviderFactory { if (!creator) { debug('the %o auth strategy is not registered, skipping', authStrategy); - throw new StrapiSDKError(`Auth strategy "${authStrategy}" is not supported.`); + throw new StrapiError(`Auth strategy "${authStrategy}" is not supported.`); } const instance = creator(options); diff --git a/src/auth/manager.ts b/src/auth/manager.ts index d584217..f382230 100644 --- a/src/auth/manager.ts +++ b/src/auth/manager.ts @@ -11,7 +11,7 @@ import type { UsersPermissionsAuthProviderOptions, } from './providers'; -const debug = createDebug('sdk:auth:manager'); +const debug = createDebug('strapi:auth:manager'); /** * Manages authentication by using different authentication providers and strategies. diff --git a/src/auth/providers/abstract.ts b/src/auth/providers/abstract.ts index 9387e7a..580552e 100644 --- a/src/auth/providers/abstract.ts +++ b/src/auth/providers/abstract.ts @@ -51,7 +51,7 @@ export abstract class AbstractAuthProvider implements AuthProvider * It is called within the constructor to ensure that all required options adhere * to the expected format or values before proceeding with operational methods. * - * @throws {StrapiSDKValidationError} If the validation fails due to invalid or missing options. + * @throws {StrapiValidationError} If the validation fails due to invalid or missing options. */ protected abstract preflightValidation(): void; diff --git a/src/auth/providers/api-token.ts b/src/auth/providers/api-token.ts index c5220cb..1673834 100644 --- a/src/auth/providers/api-token.ts +++ b/src/auth/providers/api-token.ts @@ -1,10 +1,10 @@ import createDebug from 'debug'; -import { StrapiSDKValidationError } from '../../errors'; +import { StrapiValidationError } from '../../errors'; import { AbstractAuthProvider } from './abstract'; -const debug = createDebug('sdk:auth:provider:api-token'); +const debug = createDebug('strapi:auth:provider:api-token'); const API_TOKEN_AUTH_STRATEGY_IDENTIFIER = 'api-token'; @@ -41,7 +41,7 @@ export class ApiTokenAuthProvider extends AbstractAuthProvider { - const sdkValidator = new StrapiSDKValidator(); +export const strapi = (config: StrapiConfig) => { + const configValidator = new StrapiConfigValidator(); - return new StrapiSDK( + return new Strapi( // Properties config, // Dependencies - sdkValidator + configValidator ); }; diff --git a/src/sdk.ts b/src/sdk.ts index 5b20201..68ea7d7 100644 --- a/src/sdk.ts +++ b/src/sdk.ts @@ -2,16 +2,16 @@ import createDebug from 'debug'; import { AuthManager } from './auth'; import { CollectionTypeManager, SingleTypeManager } from './content-types'; -import { StrapiSDKInitializationError } from './errors'; +import { StrapiInitializationError } from './errors'; import { HttpClient } from './http'; import { AuthInterceptors, HttpInterceptors } from './interceptors'; -import { StrapiSDKValidator } from './validators'; +import { StrapiConfigValidator } from './validators'; import type { HttpClientConfig } from './http'; -const debug = createDebug('sdk:core'); +const debug = createDebug('strapi:core'); -export interface StrapiSDKConfig { +export interface StrapiConfig { /** The base URL of the Strapi content API, required for all SDK operations. */ baseURL: string; @@ -42,12 +42,12 @@ export interface AuthConfig { * * @template T_Config - Configuration type inferred from the user-provided SDK configuration */ -export class StrapiSDK { +export class Strapi { /** @internal */ private readonly _config: T_Config; /** @internal */ - private readonly _validator: StrapiSDKValidator; + private readonly _validator: StrapiConfigValidator; /** @internal */ private readonly _authManager: AuthManager; @@ -61,7 +61,7 @@ export class StrapiSDK config: T_Config, // Dependencies - validator: StrapiSDKValidator = new StrapiSDKValidator(), + validator: StrapiConfigValidator = new StrapiConfigValidator(), authManager: AuthManager = new AuthManager(), // Lazy dependencies @@ -100,10 +100,10 @@ export class StrapiSDK * internal SDK validator. It is invoked during the initialization process to confirm that * all necessary parts are correctly configured before effectively using the SDK. * - * @throws {StrapiSDKInitializationError} If the configuration validation fails, indicating an issue with the SDK initialization process. + * @throws {StrapiInitializationError} If the configuration validation fails, indicating an issue with the SDK initialization process. * * @example - * // Creating a new instance of StrapiSDK which triggers preflightValidation + * // Creating a new instance of the SDK which triggers preflightValidation * const config = { * baseURL: 'https://example.com', * auth: { @@ -111,7 +111,7 @@ export class StrapiSDK * options: { token: 'your-token-here' } * } * }; - * const sdk = new StrapiSDK(config); + * const sdk = new Strapi(config); * * // The preflightValidation is automatically called within the constructor * // to ensure the provided config is valid prior to any further setup. @@ -125,7 +125,7 @@ export class StrapiSDK debug('validating the configuration'); this._validator.validateConfig(this._config); } catch (e) { - throw new StrapiSDKInitializationError(e); + throw new StrapiInitializationError(e); } } @@ -226,7 +226,7 @@ export class StrapiSDK * * @example * const config = { baseURL: 'http://localhost:1337/api' }; - * const sdk = new StrapiSDK(config); + * const sdk = new Strapi(config); * * console.log(sdk.baseURL); // Output: http://localhost:1337 */ @@ -245,7 +245,8 @@ export class StrapiSDK * @example * ```typescript * // Create the SDK instance - * const sdk = strapiSDK({ baseURL: 'http://localhost:1337/api' ); + * const config = { baseURL: 'http://localhost:1337/api' }; + * const sdk = new Strapi(config); * * // Perform a custom fetch query * const response = await sdk.fetch('/categories'); @@ -279,7 +280,8 @@ export class StrapiSDK * @example * ```typescript * // Initialize the SDK with required configuration - * const sdk = new StrapiSDK({ baseURL: 'http://localhost:1337/api' }); + * const config = { baseURL: 'http://localhost:1337/api' }; + * const sdk = new Strapi(config); * * // Retrieve a CollectionTypeManager for the 'articles' resource * const articles = sdk.collection('articles'); @@ -301,7 +303,7 @@ export class StrapiSDK * ``` * * @see CollectionTypeManager - * @see StrapiSDK + * @see Strapi */ collection(resource: string) { return new CollectionTypeManager(resource, this._httpClient); @@ -320,7 +322,7 @@ export class StrapiSDK * @example * ```typescript * // Initialize the SDK with required configuration - * const sdk = new StrapiSDK({ baseURL: 'http://localhost:1337/api' }); + * const sdk = new Strapi({ baseURL: 'http://localhost:1337/api' }); * * // Retrieve a SingleTypeManager for the 'homepage' resource * const homepage = sdk.single('homepage'); @@ -336,7 +338,7 @@ export class StrapiSDK * ``` * * @see SingleTypeManager - * @see StrapiSDK + * @see Strapi */ single(resource: string) { return new SingleTypeManager(resource, this._httpClient); diff --git a/src/utilities/url-helper.ts b/src/utilities/url-helper.ts index 70205e0..901683f 100644 --- a/src/utilities/url-helper.ts +++ b/src/utilities/url-helper.ts @@ -2,7 +2,7 @@ import createDebug from 'debug'; import type { BaseQueryParams } from '../types/content-api'; -const debug = createDebug('sdk:utils:url-helper'); +const debug = createDebug('strapi:utils:url-helper'); export class URLHelper { /** diff --git a/src/validators/index.ts b/src/validators/index.ts index acbffb3..a9ce9ff 100644 --- a/src/validators/index.ts +++ b/src/validators/index.ts @@ -1,2 +1,2 @@ -export { StrapiSDKValidator } from './sdk'; +export { StrapiConfigValidator } from './sdk'; export { URLValidator } from './url'; diff --git a/src/validators/sdk.ts b/src/validators/sdk.ts index 4088e3b..97bb9a1 100644 --- a/src/validators/sdk.ts +++ b/src/validators/sdk.ts @@ -1,19 +1,19 @@ import createDebug from 'debug'; -import { StrapiSDKValidationError, URLValidationError } from '../errors'; +import { StrapiValidationError, URLValidationError } from '../errors'; import { URLValidator } from './url'; -import type { StrapiSDKConfig } from '../sdk'; +import type { StrapiConfig } from '../sdk'; -const debug = createDebug('sdk:validators:sdk'); +const debug = createDebug('strapi:validators:config'); /** * Provides the ability to validate the configuration used for initializing the Strapi SDK. * * This includes URL validation to ensure compatibility with Strapi's API endpoints. */ -export class StrapiSDKValidator { +export class StrapiConfigValidator { private readonly _urlValidator: URLValidator; constructor( @@ -29,9 +29,9 @@ export class StrapiSDKValidator { * * @param config - The configuration object for the Strapi SDK. Must include a `baseURL` property indicating the API's endpoint. * - * @throws {StrapiSDKValidationError} If the configuration is invalid, or if the baseURL is invalid. + * @throws {StrapiValidationError} If the configuration is invalid, or if the baseURL is invalid. */ - validateConfig(config: StrapiSDKConfig) { + validateConfig(config: StrapiConfig) { debug('validating sdk config'); if ( @@ -42,7 +42,7 @@ export class StrapiSDKValidator { ) { debug(`provided sdk configuration is not a valid object: %o (%s)`, config, typeof config); - throw new StrapiSDKValidationError( + throw new StrapiValidationError( new TypeError('The provided configuration is not a valid object.') ); } @@ -57,7 +57,7 @@ export class StrapiSDKValidator { * * @param url - The base URL string to validate. * - * @throws {StrapiSDKValidationError} If the URL is invalid or if it fails through the URLValidator checks. + * @throws {StrapiValidationError} If the URL is invalid or if it fails through the URLValidator checks. */ private validateBaseURL(url: unknown) { try { @@ -66,7 +66,7 @@ export class StrapiSDKValidator { } catch (e) { if (e instanceof URLValidationError) { debug('failed to validate sdk config, invalid base url %o', url); - throw new StrapiSDKValidationError(e); + throw new StrapiValidationError(e); } throw e; diff --git a/src/validators/url.ts b/src/validators/url.ts index d3b2983..5ae5733 100644 --- a/src/validators/url.ts +++ b/src/validators/url.ts @@ -2,7 +2,7 @@ import createDebug from 'debug'; import { URLParsingError } from '../errors'; -const debug = createDebug('sdk:validators:url'); +const debug = createDebug('strapi:validators:url'); /** * Class representing a URLValidator. diff --git a/tests/unit/auth/factory.test.ts b/tests/unit/auth/factory.test.ts index c7f92eb..d5e52cb 100644 --- a/tests/unit/auth/factory.test.ts +++ b/tests/unit/auth/factory.test.ts @@ -1,5 +1,5 @@ +import { StrapiError } from '../../../src'; import { AuthProviderFactory } from '../../../src/auth'; -import { StrapiSDKError } from '../../../src/errors'; import { MockAuthProvider } from '../mocks'; describe('AuthProviderFactory', () => { @@ -16,7 +16,7 @@ describe('AuthProviderFactory', () => { // Act & Assert expect(() => { factory.create(invalidStrategyName, {}); - }).toThrow(StrapiSDKError); + }).toThrow(StrapiError); }); it('should create a valid instance for registered providers', () => { diff --git a/tests/unit/auth/providers/api-token.test.ts b/tests/unit/auth/providers/api-token.test.ts index 6f49d99..cb38f73 100644 --- a/tests/unit/auth/providers/api-token.test.ts +++ b/tests/unit/auth/providers/api-token.test.ts @@ -1,4 +1,4 @@ -import { StrapiSDKValidationError } from '../../../../src'; +import { StrapiValidationError } from '../../../../src'; import { ApiTokenAuthProvider, ApiTokenAuthProviderOptions } from '../../../../src/auth'; describe('ApiTokenAuthProvider', () => { @@ -32,7 +32,7 @@ describe('ApiTokenAuthProvider', () => { const token = ' '; // Act & Assert - expect(() => new ApiTokenAuthProvider({ token })).toThrow(StrapiSDKValidationError); + expect(() => new ApiTokenAuthProvider({ token })).toThrow(StrapiValidationError); expect(spy).toHaveBeenCalledTimes(1); }); @@ -50,7 +50,7 @@ describe('ApiTokenAuthProvider', () => { const options = { token: null } as unknown as ApiTokenAuthProviderOptions; // Act & Assert - expect(() => new ApiTokenAuthProvider(options)).toThrow(StrapiSDKValidationError); + expect(() => new ApiTokenAuthProvider(options)).toThrow(StrapiValidationError); expect(spy).toHaveBeenCalledTimes(1); }); }); diff --git a/tests/unit/auth/providers/users-permissions.test.ts b/tests/unit/auth/providers/users-permissions.test.ts index 12b168a..8b32e33 100644 --- a/tests/unit/auth/providers/users-permissions.test.ts +++ b/tests/unit/auth/providers/users-permissions.test.ts @@ -1,4 +1,4 @@ -import { HTTPBadRequestError, StrapiSDKValidationError } from '../../../../src'; +import { HTTPBadRequestError, StrapiValidationError } from '../../../../src'; import { UsersPermissionsAuthProvider, UsersPermissionsAuthProviderOptions, @@ -74,7 +74,7 @@ describe('UsersPermissionsAuthProvider', () => { new UsersPermissionsAuthProvider( options as unknown as UsersPermissionsAuthProviderOptions ) - ).toThrow(StrapiSDKValidationError); + ).toThrow(StrapiValidationError); expect(spy).toHaveBeenCalledTimes(1); }); diff --git a/tests/unit/errors/sdk-errors.test.ts b/tests/unit/errors/sdk-errors.test.ts index c322f15..4773868 100644 --- a/tests/unit/errors/sdk-errors.test.ts +++ b/tests/unit/errors/sdk-errors.test.ts @@ -1,14 +1,10 @@ -import { - StrapiSDKError, - StrapiSDKInitializationError, - StrapiSDKValidationError, -} from '../../../src/errors'; - -describe('SDK Errors', () => { - describe('StrapiSDKError', () => { +import { StrapiError, StrapiInitializationError, StrapiValidationError } from '../../../src'; + +describe('Strapi Errors', () => { + describe('StrapiError', () => { it('should have a default message', () => { // Act - const error = new StrapiSDKError(); + const error = new StrapiError(); // Assert expect(error.message).toBe( @@ -22,7 +18,7 @@ describe('SDK Errors', () => { const customMessage = 'Custom error message.'; // Act - const error = new StrapiSDKError(undefined, customMessage); + const error = new StrapiError(undefined, customMessage); // Assert expect(error.message).toBe(customMessage); @@ -33,17 +29,17 @@ describe('SDK Errors', () => { const cause = new Error('Root cause'); // Act - const error = new StrapiSDKError(cause); + const error = new StrapiError(cause); // Assert expect(error.cause).toBe(cause); }); }); - describe('StrapiSDKValidationError', () => { + describe('StrapiValidationError', () => { it('should have a default message', () => { // Act - const error = new StrapiSDKValidationError(); + const error = new StrapiValidationError(); // Assert expect(error.message).toBe('Some of the provided values are not valid.'); @@ -55,7 +51,7 @@ describe('SDK Errors', () => { const customMessage = 'Validation error occurred.'; // Act - const error = new StrapiSDKValidationError(undefined, customMessage); + const error = new StrapiValidationError(undefined, customMessage); // Assert expect(error.message).toBe(customMessage); @@ -66,17 +62,17 @@ describe('SDK Errors', () => { const cause = new Error('Validation root cause'); // Act - const error = new StrapiSDKValidationError(cause); + const error = new StrapiValidationError(cause); // Assert expect(error.cause).toBe(cause); }); }); - describe('StrapiSDKInitializationError', () => { + describe('StrapiInitializationError', () => { it('should have a default message', () => { // Act - const error = new StrapiSDKInitializationError(); + const error = new StrapiInitializationError(); // Assert expect(error.message).toBe('Could not initialize the Strapi SDK'); @@ -88,7 +84,7 @@ describe('SDK Errors', () => { const customMessage = 'Initialization error occurred.'; // Act - const error = new StrapiSDKInitializationError(undefined, customMessage); + const error = new StrapiInitializationError(undefined, customMessage); // Assert expect(error.message).toBe(customMessage); @@ -99,7 +95,7 @@ describe('SDK Errors', () => { const cause = new Error('Initialization root cause'); // Act - const error = new StrapiSDKInitializationError(cause); + const error = new StrapiInitializationError(cause); // Assert expect(error.cause).toBe(cause); diff --git a/tests/unit/index.test.ts b/tests/unit/index.test.ts index 6ec9212..8079848 100644 --- a/tests/unit/index.test.ts +++ b/tests/unit/index.test.ts @@ -1,27 +1,27 @@ -import { strapiSDK, StrapiSDKInitializationError, StrapiSDKValidationError } from '../../src'; -import { StrapiSDK } from '../../src/sdk'; +import { strapi, StrapiInitializationError, StrapiValidationError } from '../../src'; +import { Strapi } from '../../src/sdk'; -import type { StrapiSDKConfig } from '../../src/sdk'; +import type { StrapiConfig } from '../../src/sdk'; -describe('strapiSDK', () => { +describe('strapi', () => { it('should create an SDK instance with valid configuration', () => { // Arrange - const config = { baseURL: 'https://api.example.com' } satisfies StrapiSDKConfig; + const config = { baseURL: 'https://api.example.com' } satisfies StrapiConfig; // Act - const sdkInstance = strapiSDK(config); + const sdk = strapi(config); // Assert - expect(sdkInstance).toBeInstanceOf(StrapiSDK); - expect(sdkInstance).toHaveProperty('baseURL', config.baseURL); + expect(sdk).toBeInstanceOf(Strapi); + expect(sdk).toHaveProperty('baseURL', config.baseURL); }); it('should throw an error for an invalid baseURL', () => { // Arrange - const config = { baseURL: 'invalid-url' } satisfies StrapiSDKConfig; + const config = { baseURL: 'invalid-url' } satisfies StrapiConfig; // Act & Assert - expect(() => strapiSDK(config)).toThrow(StrapiSDKInitializationError); + expect(() => strapi(config)).toThrow(StrapiInitializationError); }); it('should throw an error if auth configuration is invalid', () => { @@ -32,9 +32,9 @@ describe('strapiSDK', () => { strategy: 'api-token', options: { token: '' }, // Invalid token }, - } satisfies StrapiSDKConfig; + } satisfies StrapiConfig; // Act & Assert - expect(() => strapiSDK(config)).toThrow(StrapiSDKValidationError); + expect(() => strapi(config)).toThrow(StrapiValidationError); }); }); diff --git a/tests/unit/mocks/index.ts b/tests/unit/mocks/index.ts index 1943dcc..6f3eadd 100644 --- a/tests/unit/mocks/index.ts +++ b/tests/unit/mocks/index.ts @@ -4,6 +4,6 @@ export { MockAuthManager } from './auth-manager.mock'; export { MockHttpClient } from './http-client.mock'; export { MockURLValidator } from './url-validator.mock'; export { MockFlakyURLValidator } from './flaky-url-validator.mock'; -export { MockStrapiSDKValidator } from './sdk-validator.mock'; +export { MockStrapiConfigValidator } from './strapi-config-validator.mock'; export { mockRequest } from './request.mock'; export { mockResponse } from './response.mock'; diff --git a/tests/unit/mocks/sdk-validator.mock.ts b/tests/unit/mocks/sdk-validator.mock.ts deleted file mode 100644 index a354fb1..0000000 --- a/tests/unit/mocks/sdk-validator.mock.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { StrapiSDKValidator } from '../../../src/validators'; - -export class MockStrapiSDKValidator extends StrapiSDKValidator {} diff --git a/tests/unit/mocks/strapi-config-validator.mock.ts b/tests/unit/mocks/strapi-config-validator.mock.ts new file mode 100644 index 0000000..54956df --- /dev/null +++ b/tests/unit/mocks/strapi-config-validator.mock.ts @@ -0,0 +1,3 @@ +import { StrapiConfigValidator } from '../../../src/validators'; + +export class MockStrapiConfigValidator extends StrapiConfigValidator {} diff --git a/tests/unit/sdk.test.ts b/tests/unit/sdk.test.ts index 33442c7..10d7533 100644 --- a/tests/unit/sdk.test.ts +++ b/tests/unit/sdk.test.ts @@ -6,25 +6,25 @@ import { HTTPInternalServerError, HTTPNotFoundError, HTTPTimeoutError, - StrapiSDKInitializationError, + StrapiInitializationError, } from '../../src'; import { CollectionTypeManager, SingleTypeManager } from '../../src/content-types'; import { HttpClient, StatusCode } from '../../src/http'; -import { StrapiSDK } from '../../src/sdk'; -import { StrapiSDKValidator } from '../../src/validators'; +import { Strapi } from '../../src/sdk'; +import { StrapiConfigValidator } from '../../src/validators'; import { MockAuthManager, MockAuthProvider, MockHttpClient, - MockStrapiSDKValidator, + MockStrapiConfigValidator, MockFlakyURLValidator, } from './mocks'; import type { HttpClientConfig } from '../../src/http'; -import type { StrapiSDKConfig } from '../../src/sdk'; +import type { StrapiConfig } from '../../src/sdk'; -describe('StrapiSDK', () => { +describe('Strapi', () => { const mockHttpClientFactory = (config: HttpClientConfig) => new MockHttpClient(config); beforeEach(() => { @@ -47,71 +47,71 @@ describe('StrapiSDK', () => { const config = { baseURL: 'https://localhost:1337/api', auth: { strategy: MockAuthProvider.identifier, options: {} }, - } satisfies StrapiSDKConfig; + } satisfies StrapiConfig; - const mockValidator = new MockStrapiSDKValidator(); + const mockValidator = new MockStrapiConfigValidator(); const mockAuthManager = new MockAuthManager(); - const sdkValidatorSpy = jest.spyOn(mockValidator, 'validateConfig'); + const validatorSpy = jest.spyOn(mockValidator, 'validateConfig'); const authSetStrategySpy = jest.spyOn(MockAuthManager.prototype, 'setStrategy'); // Act - const sdk = new StrapiSDK(config, mockValidator, mockAuthManager, mockHttpClientFactory); + const sdk = new Strapi(config, mockValidator, mockAuthManager, mockHttpClientFactory); // Assert - expect(sdk).toBeInstanceOf(StrapiSDK); - expect(sdkValidatorSpy).toHaveBeenCalledWith(config); + expect(sdk).toBeInstanceOf(Strapi); + expect(validatorSpy).toHaveBeenCalledWith(config); expect(authSetStrategySpy).toHaveBeenCalledWith(MockAuthProvider.identifier, {}); }); it('should not set the auth strategy if no auth config is provided', () => { // Arrange - const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiSDKConfig; + const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiConfig; - const mockValidator = new MockStrapiSDKValidator(); + const mockValidator = new MockStrapiConfigValidator(); const mockAuthManager = new MockAuthManager(); const authSetStrategySpy = jest.spyOn(MockAuthManager.prototype, 'setStrategy'); // Act - const sdk = new StrapiSDK(config, mockValidator, mockAuthManager, mockHttpClientFactory); + const sdk = new Strapi(config, mockValidator, mockAuthManager, mockHttpClientFactory); // Assert - expect(sdk).toBeInstanceOf(StrapiSDK); + expect(sdk).toBeInstanceOf(Strapi); expect(authSetStrategySpy).not.toHaveBeenCalled(); }); it('should throw an error on invalid baseURL', () => { // Arrange - const config = { baseURL: 'invalid-url' } satisfies StrapiSDKConfig; + const config = { baseURL: 'invalid-url' } satisfies StrapiConfig; - const mockValidator = new MockStrapiSDKValidator(); + const mockValidator = new MockStrapiConfigValidator(); const validateConfigSpy = jest.spyOn(mockValidator, 'validateConfig'); // Act & Assert - expect(() => new StrapiSDK(config, mockValidator)).toThrow(StrapiSDKInitializationError); + expect(() => new Strapi(config, mockValidator)).toThrow(StrapiInitializationError); expect(validateConfigSpy).toHaveBeenCalledWith(config); }); it('should fail to create and SDK instance if there is an unexpected error', () => { // Arrange - let sdk!: StrapiSDK; + let sdk!: Strapi; const baseURL = 'https://example.com'; - const config: StrapiSDKConfig = { baseURL } satisfies StrapiSDKConfig; - const expectedError = new StrapiSDKInitializationError(new Error('Unexpected error')); + const config: StrapiConfig = { baseURL } satisfies StrapiConfig; + const expectedError = new StrapiInitializationError(new Error('Unexpected error')); const validateSpy = jest.spyOn(MockFlakyURLValidator.prototype, 'validate'); // Act - const createSDK = () => { - sdk = new StrapiSDK(config, new StrapiSDKValidator(new MockFlakyURLValidator())); + const instantiateSDK = () => { + sdk = new Strapi(config, new StrapiConfigValidator(new MockFlakyURLValidator())); }; // Assert - expect(createSDK).toThrow(expectedError); + expect(instantiateSDK).toThrow(expectedError); expect(sdk).toBeUndefined(); @@ -121,10 +121,10 @@ describe('StrapiSDK', () => { it('should initialize correctly with the default validator', () => { // Arrange - const sdk = new StrapiSDK({ baseURL: 'https://localhost:1337/api' }); + const sdk = new Strapi({ baseURL: 'https://localhost:1337/api' }); // Act & Assert - expect(sdk).toBeInstanceOf(StrapiSDK); + expect(sdk).toBeInstanceOf(Strapi); }); }); @@ -132,12 +132,12 @@ describe('StrapiSDK', () => { it('should return a new CollectionTypeManager instance when given a resource name', () => { // Arrange const resource = 'articles'; - const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiSDKConfig; + const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiConfig; - const mockValidator = new MockStrapiSDKValidator(); + const mockValidator = new MockStrapiConfigValidator(); const mockAuthManager = new MockAuthManager(); - const sdk = new StrapiSDK(config, mockValidator, mockAuthManager, mockHttpClientFactory); + const sdk = new Strapi(config, mockValidator, mockAuthManager, mockHttpClientFactory); // Act const collection = sdk.collection(resource); @@ -152,12 +152,12 @@ describe('StrapiSDK', () => { it('should return a new SingleTypeManager instance when given a resource name', () => { // Arrange const resource = 'homepage'; - const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiSDKConfig; + const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiConfig; - const mockValidator = new MockStrapiSDKValidator(); + const mockValidator = new MockStrapiConfigValidator(); const mockAuthManager = new MockAuthManager(); - const sdk = new StrapiSDK(config, mockValidator, mockAuthManager, mockHttpClientFactory); + const sdk = new Strapi(config, mockValidator, mockAuthManager, mockHttpClientFactory); // Act const single = sdk.single(resource); @@ -173,12 +173,12 @@ describe('StrapiSDK', () => { it('fetch should add an application/json Content-Type header to each request', async () => { // Arrange const path = '/homepage'; - const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiSDKConfig; + const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiConfig; - const mockValidator = new MockStrapiSDKValidator(); + const mockValidator = new MockStrapiConfigValidator(); const mockAuthManager = new MockAuthManager(); - const sdk = new StrapiSDK(config, mockValidator, mockAuthManager, mockHttpClientFactory); + const sdk = new Strapi(config, mockValidator, mockAuthManager, mockHttpClientFactory); const fetchSpy = jest.spyOn(MockHttpClient.prototype, 'fetch'); @@ -203,12 +203,12 @@ describe('StrapiSDK', () => { ])('should throw an HTTP exception on %s error', async (_name, status, error) => { // Arrange const path = '/homepage'; - const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiSDKConfig; + const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiConfig; - const mockValidator = new MockStrapiSDKValidator(); + const mockValidator = new MockStrapiConfigValidator(); const mockAuthManager = new MockAuthManager(); - const sdk = new StrapiSDK(config, mockValidator, mockAuthManager, mockHttpClientFactory); + const sdk = new Strapi(config, mockValidator, mockAuthManager, mockHttpClientFactory); jest .spyOn(MockHttpClient.prototype, 'fetch') @@ -226,14 +226,14 @@ describe('StrapiSDK', () => { const config = { baseURL: 'https://localhost:1337/api', auth: { strategy: MockAuthProvider.identifier }, - } satisfies StrapiSDKConfig; + } satisfies StrapiConfig; - const mockValidator = new MockStrapiSDKValidator(); + const mockValidator = new MockStrapiConfigValidator(); const mockAuthManager = new MockAuthManager(); const authenticateSpy = jest.spyOn(MockAuthManager.prototype, 'authenticate'); - const sdk = new StrapiSDK(config, mockValidator, mockAuthManager, mockHttpClientFactory); + const sdk = new Strapi(config, mockValidator, mockAuthManager, mockHttpClientFactory); // Act await sdk.fetch('/'); @@ -247,14 +247,14 @@ describe('StrapiSDK', () => { const config = { baseURL: 'https://localhost:1337/api', auth: { strategy: MockAuthProvider.identifier }, - } satisfies StrapiSDKConfig; + } satisfies StrapiConfig; - const mockValidator = new MockStrapiSDKValidator(); + const mockValidator = new MockStrapiConfigValidator(); const mockAuthManager = new MockAuthManager(); const authenticateRequestSpy = jest.spyOn(MockAuthManager.prototype, 'authenticateRequest'); - const sdk = new StrapiSDK(config, mockValidator, mockAuthManager, mockHttpClientFactory); + const sdk = new Strapi(config, mockValidator, mockAuthManager, mockHttpClientFactory); // Act await sdk.fetch('/'); @@ -271,14 +271,14 @@ describe('StrapiSDK', () => { it(`shouldn't authenticates outgoing HTTP requests if no auth strategy is set`, async () => { // Arrange - const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiSDKConfig; + const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiConfig; - const mockValidator = new MockStrapiSDKValidator(); + const mockValidator = new MockStrapiConfigValidator(); const mockAuthManager = new MockAuthManager(); const authenticateRequestSpy = jest.spyOn(MockAuthManager.prototype, 'authenticateRequest'); - const sdk = new StrapiSDK(config, mockValidator, mockAuthManager, mockHttpClientFactory); + const sdk = new Strapi(config, mockValidator, mockAuthManager, mockHttpClientFactory); // Act await sdk.fetch('/'); @@ -298,12 +298,12 @@ describe('StrapiSDK', () => { const config = { baseURL: 'https://localhost:1337/api', auth: { strategy: MockAuthProvider.identifier }, - } satisfies StrapiSDKConfig; + } satisfies StrapiConfig; - const mockValidator = new MockStrapiSDKValidator(); + const mockValidator = new MockStrapiConfigValidator(); const mockAuthManager = new MockAuthManager(); - const sdk = new StrapiSDK(config, mockValidator, mockAuthManager, mockHttpClientFactory); + const sdk = new Strapi(config, mockValidator, mockAuthManager, mockHttpClientFactory); const spies = { authenticate: jest.spyOn(MockAuthManager.prototype, 'authenticate'), @@ -332,13 +332,13 @@ describe('StrapiSDK', () => { it('should fetch data correctly with fetch method', async () => { // Arrange - const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiSDKConfig; + const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiConfig; const requestSpy = jest.spyOn(MockHttpClient.prototype, 'request'); - const mockValidator = new MockStrapiSDKValidator(); + const mockValidator = new MockStrapiConfigValidator(); const mockAuthManager = new MockAuthManager(); - const sdk = new StrapiSDK(config, mockValidator, mockAuthManager, mockHttpClientFactory); + const sdk = new Strapi(config, mockValidator, mockAuthManager, mockHttpClientFactory); // Act const response = await sdk.fetch('/data'); @@ -350,12 +350,12 @@ describe('StrapiSDK', () => { it('should retrieve baseURL correctly from config', () => { // Arrange - const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiSDKConfig; + const config = { baseURL: 'https://localhost:1337/api' } satisfies StrapiConfig; - const mockValidator = new MockStrapiSDKValidator(); + const mockValidator = new MockStrapiConfigValidator(); const mockAuthManager = new MockAuthManager(); - const sdk = new StrapiSDK(config, mockValidator, mockAuthManager, mockHttpClientFactory); + const sdk = new Strapi(config, mockValidator, mockAuthManager, mockHttpClientFactory); // Act const { baseURL } = sdk; diff --git a/tests/unit/validators/sdk.test.ts b/tests/unit/validators/strapi-config.test.ts similarity index 61% rename from tests/unit/validators/sdk.test.ts rename to tests/unit/validators/strapi-config.test.ts index 6e6e92a..545e8b4 100644 --- a/tests/unit/validators/sdk.test.ts +++ b/tests/unit/validators/strapi-config.test.ts @@ -1,9 +1,9 @@ -import { StrapiSDKValidationError, URLValidationError } from '../../../src'; -import { StrapiSDKValidator, URLValidator } from '../../../src/validators'; +import { StrapiValidationError, URLValidationError } from '../../../src'; +import { StrapiConfigValidator, URLValidator } from '../../../src/validators'; -import type { StrapiSDKConfig } from '../../../src/sdk'; +import type { StrapiConfig } from '../../../src/sdk'; -describe('Strapi SDKValidator', () => { +describe('Strapi Config Validator', () => { let urlValidatorMock: jest.Mocked; beforeEach(() => { @@ -16,20 +16,20 @@ describe('Strapi SDKValidator', () => { 'should throw an error if config is not a valid object (%s)', (config: unknown) => { // Arrange - const validator = new StrapiSDKValidator(urlValidatorMock); - const expected = new StrapiSDKValidationError( + const validator = new StrapiConfigValidator(urlValidatorMock); + const expected = new StrapiValidationError( new TypeError('The provided configuration is not a valid object.') ); // Act & Assert - expect(() => validator.validateConfig(config as StrapiSDKConfig)).toThrow(expected); + expect(() => validator.validateConfig(config as StrapiConfig)).toThrow(expected); } ); it('should not throw an error if config is a valid object', () => { // Arrange const config = { baseURL: 'https://example.com' }; - const validator = new StrapiSDKValidator(urlValidatorMock); + const validator = new StrapiConfigValidator(urlValidatorMock); // Act & Assert expect(() => validator.validateConfig(config)).not.toThrow(); @@ -39,8 +39,8 @@ describe('Strapi SDKValidator', () => { describe('validateBaseURL', () => { it('should call validateBaseURL method with the baseURL', () => { // Arrange - const validator = new StrapiSDKValidator(urlValidatorMock); - const config: StrapiSDKConfig = { baseURL: 'http://valid.url' }; + const validator = new StrapiConfigValidator(urlValidatorMock); + const config: StrapiConfig = { baseURL: 'http://valid.url' }; // Act validator.validateConfig(config); @@ -49,9 +49,9 @@ describe('Strapi SDKValidator', () => { expect(urlValidatorMock.validate).toHaveBeenCalledWith('http://valid.url'); }); - it('should throw StrapiSDKValidationError on URLValidationError', () => { + it('should throw StrapiValidationError on URLValidationError', () => { // Arrange - const validator = new StrapiSDKValidator(urlValidatorMock); + const validator = new StrapiConfigValidator(urlValidatorMock); const baseURL = 'invalid-url'; urlValidatorMock.validate.mockImplementationOnce(() => { @@ -59,7 +59,7 @@ describe('Strapi SDKValidator', () => { }); // Act & Assert - expect(() => validator.validateConfig({ baseURL })).toThrow(StrapiSDKValidationError); + expect(() => validator.validateConfig({ baseURL })).toThrow(StrapiValidationError); }); }); });