diff --git a/front/src/app/politica-cookies/page.tsx b/front/src/app/politica-cookies/page.tsx deleted file mode 100644 index 2b40a03..0000000 --- a/front/src/app/politica-cookies/page.tsx +++ /dev/null @@ -1,180 +0,0 @@ -const CookiesPolicyPage = () => { - return ( -
-

Política de Cookies

- -
-
-

¿Qué son las cookies?

-

- Las cookies son pequeños archivos de texto que se almacenan en el - dispositivo del usuario cuando visita un sitio web. Sirven para - garantizar el correcto funcionamiento del sitio, recopilar - información estadística o mejorar la experiencia de navegación. -

-
- -
-

- Tipos de cookies utilizadas en este sitio web -

-

- El sitio web Infoembalses utiliza únicamente cookies de análisis, - concretamente el servicio Google Analytics, con la finalidad - exclusiva de medir el tráfico y analizar el uso del sitio web. -

-

- No se utilizan cookies publicitarias ni cookies para elaborar - perfiles comerciales de los usuarios. -

-
- -
-

- Cookies de terceros: Google Analytics -

-

- Este sitio web utiliza Google Analytics, un servicio de analítica - web prestado por Google LLC. -

-

- Google Analytics utiliza cookies para recopilar información anónima - sobre: -

-
    -
  • Número de visitantes
  • -
  • Páginas visitadas
  • -
  • Tiempo de navegación
  • -
  • Tipo de dispositivo y navegador
  • -
-

- La información generada por las cookies es transmitida y almacenada - por Google en sus servidores. Infoembalses utiliza esta información - únicamente con fines estadísticos y para mejorar el funcionamiento - del sitio web. -

-

- Más información: -
- - https://policies.google.com/privacy - -
- - https://developers.google.com/analytics/devguides/collection/ga4 - -

-
- -
-

- Base legal para el uso de cookies -

-

- El uso de cookies analíticas se basa en el consentimiento del - usuario, conforme a la normativa vigente en materia de protección de - datos y servicios de la sociedad de la información. -

-

- Al acceder al sitio web, el usuario podrá aceptar o rechazar el uso - de cookies analíticas a través del mecanismo de configuración - habilitado. -

-
- -
-

- Cómo gestionar o desactivar las cookies -

-

- El usuario puede permitir, bloquear o eliminar las cookies - instaladas en su dispositivo mediante la configuración de las - opciones del navegador que utilice. -

-

- A continuación, se facilitan enlaces a la gestión de cookies en los - principales navegadores: -

- -

- La desactivación de cookies analíticas no impedirá el uso del sitio - web. -

-
- -
-

- Actualizaciones de la política de cookies -

-

- La presente Política de Cookies puede ser actualizada en función de - cambios normativos o técnicos. Se recomienda al usuario revisarla - periódicamente. -

-
- -
-

Contacto

-

- Para cualquier duda relacionada con el uso de cookies en este sitio - web, el usuario puede contactar a través del correo electrónico: -

-

info@lemoncode.net

-
-
-
- ); -}; - -export default CookiesPolicyPage; diff --git a/front/src/pods/embalse-search/embalse-search.business.spec.ts b/front/src/pods/embalse-search/embalse-search.business.spec.ts new file mode 100644 index 0000000..052a5a3 --- /dev/null +++ b/front/src/pods/embalse-search/embalse-search.business.spec.ts @@ -0,0 +1,155 @@ +import { describe, it, expect } from "vitest"; +import { normalizeSearchString, getFilteredEmbalses } from './embalse-search.business'; + +describe('normalizeSearchString', () => { + it('should return a empty string when input is empty', () => { + // Arrange + const input = ''; + + // Act + const result = normalizeSearchString(input); + + // Assert + expect(result).toBe(''); + }); + + it('should return a empty string when input is null', () => { + // Arrange + const input: any = null; + + // Act + const result = normalizeSearchString(input); + + // Assert + expect(result).toBe(''); + }); + + it('should return a empty string when input is undefined', () => { + // Arrange + const input: any = undefined; + + // Act + const result = normalizeSearchString(input); + + // Assert + expect(result).toBe(''); + }); + + it('should normalize a string by removing accents, punctuation and extra spaces', () => { + // Arrange + const input = ' Guadalquivir '; + const expectedResult = 'guadalquivir'; + + // Act + const result = normalizeSearchString(input); + + // Assert + expect(result).toBe(expectedResult); + }); + + it('should normalize a string with accents', () => { + // Arrange + const input = 'Sistema Valle de Arán'; + const expectedResult = 'sistema valle de aran'; + + // Act + const result = normalizeSearchString(input); + + // Assert + expect(result).toBe(expectedResult); + }); + + it('should normalize a string with punctuation', () => { + // Arrange + const input = 'Embalse de la Mora, Huelva.'; + const expectedResult = 'embalse de la mora huelva'; + + // Act + const result = normalizeSearchString(input); + + // Assert + expect(result).toBe(expectedResult); + }); + + it('should return Avinuela, when feed Aviñuela', () => { + // Arrange + const input = 'Aviñuela'; + const expectedResult = 'avinuela'; + + // Act + const result = normalizeSearchString(input); + + // Assert + expect(result).toBe(expectedResult); + }); + +}); + +describe('getFilteredEmbalses', () => { + it('should return an empty array when embalses and inputValue is empty', () => { + // Arrange + const inputValue = ''; + const embalses = []; + + // Act + const result = getFilteredEmbalses(inputValue, embalses); + + // Assert + expect(result).toEqual([]); + }); + + it('should return an empty array when embalses is empty and inputValue is null', () => { + // Arrange + const inputValue = null as any; + const embalses = []; + + // Act + const result = getFilteredEmbalses(inputValue, embalses); + + // Assert + expect(result).toEqual([]); + }); + + it('should return an empty array when embalses is empty and inputValue is undefined', () => { + // Arrange + const inputValue = undefined as any; + const embalses = []; + + // Act + const result = getFilteredEmbalses(inputValue, embalses); + + // Assert + expect(result).toEqual([]); + }); + + it('should return an empty array when embalses is empty', () => { + // Arrange + const inputValue = 'Viñuela'; + const embalses = []; + + // Act + const result = getFilteredEmbalses(inputValue, embalses); + + // Assert + expect(result).toEqual([]); + }); + + it('should return filtered embalses based on inputValue', () => { + // Arrange + const inputValue = 'Viñuela'; + const embalses = [ + { _id: '1', nombre: 'Embalse de la Mora', provincia: 'Huelva' }, + { _id: '2', nombre: 'Embalse de la Viñuela', provincia: 'Málaga' }, + ]; + const expectedResult = [ + { slug: '2', name: 'Embalse de la Viñuela (Málaga)' }, + ]; + + // Act + const result = getFilteredEmbalses(inputValue, embalses); + + // Assert + expect(result).toEqual(expectedResult); + }); +}); + diff --git a/front/src/pods/embalse-search/embalse-search.business.ts b/front/src/pods/embalse-search/embalse-search.business.ts new file mode 100644 index 0000000..792e2cc --- /dev/null +++ b/front/src/pods/embalse-search/embalse-search.business.ts @@ -0,0 +1,35 @@ +import { mapEmbalseToSearch } from "./embalse-search.mapper"; +import { Embalse } from "./api"; + +export const normalizeSearchString = (input: string): string => { + return input ? + input.toString() + .normalize("NFD") // Separa los acentos de las letras + .replace(/[\u0300-\u036f]/g, "") // Elimina acentos + .toLowerCase() + .replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g, "") // Elimina signos de puntuación + .replace(/\s+/g, " ").trim() : ""; // Reemplaza múltiples espacios por uno +}; +// encontre todos esos filtros por internet y los aplico si sobra alguno lo quitamos, también dejé las descripciones + +export const getFilteredEmbalses = ( + inputValue: string, + embalses: Embalse[], +) => { + if (!embalses || embalses.length === 0) { + return []; + } + + const lower = normalizeSearchString(inputValue); + const normalizedInputValue = normalizeSearchString(inputValue); + + return embalses + .filter( + (e) => + e.nombre.toLowerCase().includes(lower) || + (e.provincia ?? "").toLowerCase().includes(lower) || + normalizeSearchString(e.nombre ?? "").includes(normalizedInputValue) || + normalizeSearchString(e.provincia ?? "").includes(normalizedInputValue), + ) + .map(mapEmbalseToSearch); +}; diff --git a/front/src/pods/embalse-search/embalse-search.tsx b/front/src/pods/embalse-search/embalse-search.tsx index a7bf4a1..aeaffe8 100644 --- a/front/src/pods/embalse-search/embalse-search.tsx +++ b/front/src/pods/embalse-search/embalse-search.tsx @@ -6,7 +6,7 @@ import { useRouter } from "next/navigation"; import { NoResult } from "./components/no-result"; import { Embalse } from "./api"; import { EmbalseSearchModel } from "./embalse-search.vm"; -import { mapEmbalseToSearch } from "./embalse-search.mapper"; +import { getFilteredEmbalses as getFilteredEmbalsesBusiness } from "./embalse-search.business"; import { FilteredList } from "./components/filtered-list"; import { Input } from "./components/input"; @@ -24,17 +24,8 @@ export const EmbalseSearch: React.FC = (props) => { const [inputValue, setInputValue] = useState(""); const getFilteredEmbalses = (inputValue: string): EmbalseSearchModel[] => { - const lower = inputValue.toLowerCase(); - - return embalses - .filter( - (e) => - e.nombre.toLowerCase().includes(lower) || - e.provincia.toLowerCase().includes(lower), - ) - .map(mapEmbalseToSearch); + return getFilteredEmbalsesBusiness(inputValue, embalses); }; - const { isOpen, getMenuProps,