No Results Found
The page you requested could not be found. Try refining your search, or use the navigation above to locate the post.
{ "title": "SCF Textarea Field Fragment", "description": "Type-specific properties for textarea fields", "type": "object", "properties": { "type": { "enum": [ "textarea" ] }, "default_value": { "$ref": "#/definitions/default_value" }, "maxlength": { "$ref": "#/definitions/maxlength" }, "rows": { "$ref": "#/definitions/rows" }, "placeholder": { "$ref": "#/definitions/placeholder" }, "new_lines": { "$ref": "#/definitions/new_lines" } } } /** * @jest-environment jest-fixed-jsdom */ describe( 'Address Autocomplete Provider Registration', () => { beforeEach( () => { delete global.window.wc; // Reset the window object and providers before each test Object.assign( global.window, { wc_address_autocomplete_params: { address_providers: JSON.stringify( [ { id: 'test-provider', name: 'Test provider' }, { id: 'wc-payments', name: 'WooCommerce Payments' }, { id: 'provider-1', name: 'Provider 1' }, { id: 'provider-2', name: 'Provider 2' }, ] ), }, } ); // Reset the module before each test jest.resetModules(); require( '../utils/address-autocomplete-common' ); require( '../address-autocomplete' ); } ); test( 'should successfully register a valid provider', () => { const validProvider = { id: 'test-provider', canSearch: () => {}, search: () => {}, select: () => {}, }; const result = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( validProvider ); expect( result ).toBe( true ); expect( console ).not.toHaveErrored(); } ); test( 'should reject invalid provider (null, undefined, non-object)', () => { const invalidProviders = [ null, undefined, 'string', 123, true ]; invalidProviders.forEach( ( provider ) => { const result = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( provider ); expect( result ).toBe( false ); expect( console ).toHaveErroredWith( 'Error registering address provider:', 'Address provider must be a valid object' ); expect( console ).toHaveErrored(); } ); } ); test( 'should handle missing wc_address_autocomplete_params', () => { delete global.window.wc; // ensure fresh load global.window.wc_address_autocomplete_params = undefined; jest.resetModules(); require( '../utils/address-autocomplete-common' ); require( '../address-autocomplete' ); const validProvider = { id: 'test-provider', canSearch: () => {}, search: () => {}, select: () => {}, }; const result = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( validProvider ); expect( result ).toBe( false ); expect( console ).toHaveErroredWith( 'Error registering address provider:', 'Provider test-provider not registered on server' ); } ); test( 'should handle invalid address_providers type', () => { delete global.window.wc; // ensure fresh load global.window.wc_address_autocomplete_params = undefined; jest.resetModules(); require( '../utils/address-autocomplete-common' ); require( '../address-autocomplete' ); const validProvider = { id: 'test-provider', canSearch: () => {}, search: () => {}, select: () => {}, }; const result = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( validProvider ); expect( result ).toBe( false ); expect( console ).toHaveErroredWith( 'Error registering address provider:', 'Provider test-provider not registered on server' ); } ); test( 'should reject provider without ID', () => { const invalidProvider = { canSearch: () => {}, search: () => {}, select: () => {}, }; const result = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( invalidProvider ); expect( result ).toBe( false ); expect( console ).toHaveErroredWith( 'Error registering address provider:', 'Address provider must have a valid ID' ); } ); test( 'should reject provider with non-string ID', () => { const invalidProvider = { id: 123, canSearch: () => {}, search: () => {}, select: () => {}, }; const result = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( invalidProvider ); expect( result ).toBe( false ); expect( console ).toHaveErroredWith( 'Error registering address provider:', 'Address provider must have a valid ID' ); } ); test( 'should reject provider without canSearch function', () => { const invalidProvider = { id: 'test-provider', search: () => {}, select: () => {}, }; const result = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( invalidProvider ); expect( result ).toBe( false ); expect( console ).toHaveErroredWith( 'Error registering address provider:', 'Address provider must have a canSearch function' ); } ); test( 'should reject provider without search function', () => { const invalidProvider = { id: 'test-provider', canSearch: () => {}, select: () => {}, }; const result = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( invalidProvider ); expect( result ).toBe( false ); expect( console ).toHaveErroredWith( 'Error registering address provider:', 'Address provider must have a search function' ); } ); test( 'should reject provider without select function', () => { const invalidProvider = { id: 'test-provider', canSearch: () => {}, search: () => {}, }; const result = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( invalidProvider ); expect( result ).toBe( false ); expect( console ).toHaveErroredWith( 'Error registering address provider:', 'Address provider must have a select function' ); } ); test( 'should reject provider not registered on server', () => { const unregisteredProvider = { id: 'unregistered-provider', canSearch: () => {}, search: () => {}, select: () => {}, }; const result = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( unregisteredProvider ); expect( result ).toBe( false ); expect( console ).toHaveErroredWith( 'Error registering address provider:', 'Provider unregistered-provider not registered on server' ); } ); test( 'should freeze provider after successful registration', () => { const validProvider = { id: 'test-provider', canSearch: () => {}, search: () => {}, select: () => {}, }; const result = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( validProvider ); expect( result ).toBe( true ); // Verify provider is frozen expect( Object.isFrozen( window.wc.addressAutocomplete.providers[ 'test-provider' ] ) ).toBe( true ); // Attempt to modify should throw in strict mode expect( () => { window.wc.addressAutocomplete.providers[ 'test-provider' ].newProp = 'test'; } ).toThrow( TypeError ); // Verify the property wasn't added expect( window.wc.addressAutocomplete.providers[ 'test-provider' ].newProp ).toBeUndefined(); } ); test( 'should not allow duplicate provider registration', () => { const provider1 = { id: 'test-provider', canSearch: () => false, search: () => [ 'original' ], select: () => {}, }; const provider2 = { id: 'test-provider', canSearch: () => true, search: () => [ 'duplicate' ], select: () => {}, }; // Mock console.warn to capture warning message const consoleSpy = jest .spyOn( console, 'warn' ) .mockImplementation( () => {} ); // Register first provider const firstResult = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( provider1 ); expect( firstResult ).toBe( true ); // Try to register second provider with same ID const duplicateResult = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( provider2 ); expect( duplicateResult ).toBe( false ); // Verify warning was logged expect( consoleSpy ).toHaveBeenCalledWith( 'Address provider with ID "test-provider" is already registered.' ); // Verify the original provider is preserved (not overwritten) expect( window.wc.addressAutocomplete.providers[ 'test-provider' ].canSearch() ).toBe( false ); expect( window.wc.addressAutocomplete.providers[ 'test-provider' ].search() ).toEqual( [ 'original' ] ); consoleSpy.mockRestore(); } ); test( 'should allow multiple providers with different IDs', () => { const provider1 = { id: 'provider-1', canSearch: () => true, search: () => [ 'provider1-results' ], select: () => {}, }; const provider2 = { id: 'provider-2', canSearch: () => true, search: () => [ 'provider2-results' ], select: () => {}, }; // Register both providers const result1 = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( provider1 ); const result2 = window.wc.addressAutocomplete.registerAddressAutocompleteProvider( provider2 ); expect( result1 ).toBe( true ); expect( result2 ).toBe( true ); // Verify both providers are registered expect( window.wc.addressAutocomplete.providers[ 'provider-1' ] ).toBeDefined(); expect( window.wc.addressAutocomplete.providers[ 'provider-2' ] ).toBeDefined(); // Verify they maintain their separate functionality expect( window.wc.addressAutocomplete.providers[ 'provider-1' ].search() ).toEqual( [ 'provider1-results' ] ); expect( window.wc.addressAutocomplete.providers[ 'provider-2' ].search() ).toEqual( [ 'provider2-results' ] ); } ); } ); describe( 'Address Suggestions Component', () => { let mockProvider; let billingAddressInput; let shippingAddressInput; beforeEach( async () => { // Reset DOM document.body.innerHTML = ''; delete global.window.wc; // Mock jQuery global.window.jQuery = jest.fn( ( selector ) => ( { hasClass: jest.fn( () => false ), trigger: jest.fn(), select2: jest.fn(), on: jest.fn(), } ) ); // Setup window object Object.assign( global.window, { DOMPurify: { sanitize: ( input ) => input, // No-op for testing }, wc_address_autocomplete_common_params: { address_providers: JSON.stringify( [ { id: 'test-provider', name: 'Test provider', branding_html: '
The page you requested could not be found. Try refining your search, or use the navigation above to locate the post.