[ACS-10384] after recent changes search query builder can t process non latin characters (#11241)

* [ACS-10384] Fixed error when using non-latina characters in search

* [ACS-10384] Unit tests
This commit is contained in:
AleksanderSklorz
2025-10-07 08:08:46 +02:00
committed by GitHub
parent 8b553bb00f
commit 33ca9313be
3 changed files with 85 additions and 1 deletions
@@ -582,7 +582,7 @@ export abstract class BaseQueryBuilderService {
*/
encodeQuery() {
try {
this.encodedQuery = btoa(JSON.stringify(this.filterRawParams));
this.encodedQuery = btoa(String.fromCharCode(...new TextEncoder().encode(JSON.stringify(this.filterRawParams))));
} catch (error) {
console.error('Failed to encode query parameters:', error);
this.encodedQuery = '';
@@ -21,12 +21,18 @@ import { SearchHeaderQueryBuilderService } from './search-header-query-builder.s
import { TestBed } from '@angular/core/testing';
import { ContentTestingModule } from '../../testing/content.testing.module';
import { AlfrescoApiService } from '../../services/alfresco-api.service';
import { ActivatedRoute, Router } from '@angular/router';
describe('SearchHeaderQueryBuilderService', () => {
let activatedRoute: ActivatedRoute;
let router: Router;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ContentTestingModule]
});
router = TestBed.inject(Router);
activatedRoute = TestBed.inject(ActivatedRoute);
});
const buildConfig = (searchSettings): AppConfigService => {
@@ -142,4 +148,43 @@ describe('SearchHeaderQueryBuilderService', () => {
expect(searchHeaderService.activeFilters.length).toBe(1);
});
});
describe('updateSearchQueryParams', () => {
it('should use properly encoded query containing non-latin character when calls router.navigate', () => {
spyOn(router, 'navigate');
spyOn(console, 'error');
const service = TestBed.inject(SearchHeaderQueryBuilderService);
service.filterRawParams = { userQuery: '((cm:name:"wąż*" OR cm:title:"wąż*" OR cm:description:"wąż*" OR TEXT:"wąż*" OR TAG:"wąż*"))' };
service.updateSearchQueryParams();
expect(console.error).not.toHaveBeenCalled();
expect(router.navigate).toHaveBeenCalledWith([], {
relativeTo: activatedRoute,
queryParams: {
q: 'eyJ1c2VyUXVlcnkiOiIoKGNtOm5hbWU6XCJ3xIXFvCpcIiBPUiBjbTp0aXRsZTpcInfEhcW8KlwiIE9SIGNtOmRlc2NyaXB0aW9uOlwid8SFxbwqXCIgT1IgVEVYVDpcInfEhcW8KlwiIE9SIFRBRzpcInfEhcW8KlwiKSkifQ=='
},
queryParamsHandling: 'merge'
});
});
});
describe('navigateToSearch', () => {
it('should use properly encoded query containing non-latin character when calls router.navigate', async () => {
spyOn(router, 'navigate');
spyOn(console, 'error');
const searchUrl = 'search';
const service = TestBed.inject(SearchHeaderQueryBuilderService);
service.filterRawParams = { userQuery: '((cm:name:"wąż*" OR cm:title:"wąż*" OR cm:description:"wąż*" OR TEXT:"wąż*" OR TAG:"wąż*"))' };
service.encodeQuery();
await service.navigateToSearch('', searchUrl);
expect(console.error).not.toHaveBeenCalled();
expect(router.navigate).toHaveBeenCalledWith([searchUrl], {
queryParams: {
q: 'eyJ1c2VyUXVlcnkiOiIoKGNtOm5hbWU6XCJ3xIXFvCpcIiBPUiBjbTp0aXRsZTpcInfEhcW8KlwiIE9SIGNtOmRlc2NyaXB0aW9uOlwid8SFxbwqXCIgT1IgVEVYVDpcInfEhcW8KlwiIE9SIFRBRzpcInfEhcW8KlwiKSkifQ=='
},
queryParamsHandling: 'merge'
});
});
});
});
@@ -801,4 +801,43 @@ describe('SearchQueryBuilder', () => {
});
});
});
describe('updateSearchQueryParams', () => {
it('should use properly encoded query containing non-latin character when calls router.navigate', () => {
spyOn(router, 'navigate');
spyOn(console, 'error');
const service = TestBed.inject(SearchQueryBuilderService);
service.filterRawParams = { userQuery: '((cm:name:"wąż*" OR cm:title:"wąż*" OR cm:description:"wąż*" OR TEXT:"wąż*" OR TAG:"wąż*"))' };
service.updateSearchQueryParams();
expect(console.error).not.toHaveBeenCalled();
expect(router.navigate).toHaveBeenCalledWith([], {
relativeTo: activatedRoute,
queryParams: {
q: 'eyJ1c2VyUXVlcnkiOiIoKGNtOm5hbWU6XCJ3xIXFvCpcIiBPUiBjbTp0aXRsZTpcInfEhcW8KlwiIE9SIGNtOmRlc2NyaXB0aW9uOlwid8SFxbwqXCIgT1IgVEVYVDpcInfEhcW8KlwiIE9SIFRBRzpcInfEhcW8KlwiKSkifQ=='
},
queryParamsHandling: 'merge'
});
});
});
describe('navigateToSearch', () => {
it('should use properly encoded query containing non-latin character when calls router.navigate', async () => {
spyOn(router, 'navigate');
spyOn(console, 'error');
const searchUrl = 'search';
const service = TestBed.inject(SearchQueryBuilderService);
service.filterRawParams = { userQuery: '((cm:name:"wąż*" OR cm:title:"wąż*" OR cm:description:"wąż*" OR TEXT:"wąż*" OR TAG:"wąż*"))' };
service.encodeQuery();
await service.navigateToSearch('', searchUrl);
expect(console.error).not.toHaveBeenCalled();
expect(router.navigate).toHaveBeenCalledWith([searchUrl], {
queryParams: {
q: 'eyJ1c2VyUXVlcnkiOiIoKGNtOm5hbWU6XCJ3xIXFvCpcIiBPUiBjbTp0aXRsZTpcInfEhcW8KlwiIE9SIGNtOmRlc2NyaXB0aW9uOlwid8SFxbwqXCIgT1IgVEVYVDpcInfEhcW8KlwiIE9SIFRBRzpcInfEhcW8KlwiKSkifQ=='
},
queryParamsHandling: 'merge'
});
});
});
});