From f2449980139bc14ba14a4046b476faf89dba3b15 Mon Sep 17 00:00:00 2001 From: Rachid Date: Thu, 5 Oct 2023 09:20:21 +0200 Subject: [PATCH 1/3] feat(cookie-consent): pass cookie options when deleting one consent --- .changeset/silver-camels-worry.md | 5 +++++ .../src/CookieConsentProvider/CookieConsentProvider.tsx | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/silver-camels-worry.md diff --git a/.changeset/silver-camels-worry.md b/.changeset/silver-camels-worry.md new file mode 100644 index 000000000..e88e3a6ce --- /dev/null +++ b/.changeset/silver-camels-worry.md @@ -0,0 +1,5 @@ +--- +'@scaleway/cookie-consent': patch +--- + +Pass cookie options when removing consent for a specific category diff --git a/packages/cookie-consent/src/CookieConsentProvider/CookieConsentProvider.tsx b/packages/cookie-consent/src/CookieConsentProvider/CookieConsentProvider.tsx index dd38305ba..36d6ea16b 100644 --- a/packages/cookie-consent/src/CookieConsentProvider/CookieConsentProvider.tsx +++ b/packages/cookie-consent/src/CookieConsentProvider/CookieConsentProvider.tsx @@ -152,6 +152,7 @@ export const CookieConsentProvider = ({ if (!consentValue) { // If consent is set to false we have to delete the cookie document.cookie = cookie.serialize(cookieName, '', { + ...cookiesOptions, expires: new Date(0), }) } else { From 9d1faabba72ca8af83b251993593647794fb9abe Mon Sep 17 00:00:00 2001 From: Rachid Date: Thu, 5 Oct 2023 10:00:32 +0200 Subject: [PATCH 2/3] feat(cookie-consent): add test --- .../CookieConsentProvider.tsx | 2 +- .../CookieConsentProvider/__tests__/index.tsx | 34 ++++++++++++++++++- .../src/CookieConsentProvider/index.tsx | 1 + 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/packages/cookie-consent/src/CookieConsentProvider/CookieConsentProvider.tsx b/packages/cookie-consent/src/CookieConsentProvider/CookieConsentProvider.tsx index 36d6ea16b..a7c344214 100644 --- a/packages/cookie-consent/src/CookieConsentProvider/CookieConsentProvider.tsx +++ b/packages/cookie-consent/src/CookieConsentProvider/CookieConsentProvider.tsx @@ -22,7 +22,7 @@ const CONSENT_MAX_AGE = 13 * 30 * 24 * 60 * 60 // Appx 6 Months const CONSENT_ADVERTISING_MAX_AGE = 6 * 30 * 24 * 60 * 60 -const COOKIES_OPTIONS = { +export const COOKIES_OPTIONS = { sameSite: 'strict', secure: true, path: '/', diff --git a/packages/cookie-consent/src/CookieConsentProvider/__tests__/index.tsx b/packages/cookie-consent/src/CookieConsentProvider/__tests__/index.tsx index 8560a3d64..a1f97e8f5 100644 --- a/packages/cookie-consent/src/CookieConsentProvider/__tests__/index.tsx +++ b/packages/cookie-consent/src/CookieConsentProvider/__tests__/index.tsx @@ -3,7 +3,7 @@ import { afterEach, describe, expect, it, jest } from '@jest/globals' import { act, renderHook } from '@testing-library/react' import cookie from 'cookie' import type { ComponentProps, ReactNode } from 'react' -import { CookieConsentProvider, useCookieConsent } from '..' +import { COOKIES_OPTIONS, CookieConsentProvider, useCookieConsent } from '..' const wrapper = ({ @@ -241,4 +241,36 @@ describe('CookieConsent - CookieConsentProvider', () => { 'Salesforce custom destination (Scaleway)': true, }) }) + + it('should delete a cookie correctly with appropriate options', () => { + const spy = jest.spyOn(cookie, 'serialize') + + const { result } = renderHook(() => useCookieConsent(), { + wrapper: wrapper({ + isConsentRequired: true, + essentialIntegrations: ['Deskpro', 'Stripe', 'Sentry'], + config: { + segment: { + cdnURL: 'url', + writeKey: 'key', + }, + }, + }), + }) + + act(() => { + result.current.saveConsent({ marketing: false }) + }) + + const expectedDeleteCookieOptions = { + ...COOKIES_OPTIONS, + expires: expect.any(Date), + } + + expect(spy).toHaveBeenCalledWith( + '_scw_rgpd_marketing', + '', + expectedDeleteCookieOptions, + ) + }) }) diff --git a/packages/cookie-consent/src/CookieConsentProvider/index.tsx b/packages/cookie-consent/src/CookieConsentProvider/index.tsx index 9e2c05d19..ef5a15d92 100644 --- a/packages/cookie-consent/src/CookieConsentProvider/index.tsx +++ b/packages/cookie-consent/src/CookieConsentProvider/index.tsx @@ -1,6 +1,7 @@ export { CookieConsentProvider, useCookieConsent, + COOKIES_OPTIONS, } from './CookieConsentProvider' export type { CategoryKind, Consent } from './types' export { useSegmentIntegrations } from './useSegmentIntegrations' From 797cc4129bd88f8199f69defb564016782c762c3 Mon Sep 17 00:00:00 2001 From: Rachid Date: Thu, 5 Oct 2023 15:06:08 +0200 Subject: [PATCH 3/3] feat: update test to fix conflict --- .../CookieConsentProvider.tsx | 2 +- .../CookieConsentProvider/__tests__/index.tsx | 40 ++----------------- .../src/CookieConsentProvider/index.tsx | 1 - 3 files changed, 4 insertions(+), 39 deletions(-) diff --git a/packages/cookie-consent/src/CookieConsentProvider/CookieConsentProvider.tsx b/packages/cookie-consent/src/CookieConsentProvider/CookieConsentProvider.tsx index a7c344214..36d6ea16b 100644 --- a/packages/cookie-consent/src/CookieConsentProvider/CookieConsentProvider.tsx +++ b/packages/cookie-consent/src/CookieConsentProvider/CookieConsentProvider.tsx @@ -22,7 +22,7 @@ const CONSENT_MAX_AGE = 13 * 30 * 24 * 60 * 60 // Appx 6 Months const CONSENT_ADVERTISING_MAX_AGE = 6 * 30 * 24 * 60 * 60 -export const COOKIES_OPTIONS = { +const COOKIES_OPTIONS = { sameSite: 'strict', secure: true, path: '/', diff --git a/packages/cookie-consent/src/CookieConsentProvider/__tests__/index.tsx b/packages/cookie-consent/src/CookieConsentProvider/__tests__/index.tsx index a1f97e8f5..cb639d3ac 100644 --- a/packages/cookie-consent/src/CookieConsentProvider/__tests__/index.tsx +++ b/packages/cookie-consent/src/CookieConsentProvider/__tests__/index.tsx @@ -3,7 +3,7 @@ import { afterEach, describe, expect, it, jest } from '@jest/globals' import { act, renderHook } from '@testing-library/react' import cookie from 'cookie' import type { ComponentProps, ReactNode } from 'react' -import { COOKIES_OPTIONS, CookieConsentProvider, useCookieConsent } from '..' +import { CookieConsentProvider, useCookieConsent } from '..' const wrapper = ({ @@ -149,18 +149,16 @@ describe('CookieConsent - CookieConsentProvider', () => { }) }) - const cookieOptions = { sameSite: 'strict', secure: true } + const cookieOptions = { sameSite: 'strict', secure: true, path: '/' } expect(spy).toHaveBeenCalledTimes(3) expect(spy).toHaveBeenNthCalledWith(2, '_scw_rgpd_marketing', 'true', { ...cookieOptions, maxAge: 33696000, - path: '/', }) expect(spy).toHaveBeenNthCalledWith(3, '_scw_rgpd_hash', '913003917', { ...cookieOptions, maxAge: 15552000, - path: '/', }) act(() => { @@ -172,12 +170,12 @@ describe('CookieConsent - CookieConsentProvider', () => { expect(spy).toHaveBeenCalledTimes(6) expect(spy).toHaveBeenNthCalledWith(5, '_scw_rgpd_marketing', '', { + ...cookieOptions, expires: new Date(0), }) expect(spy).toHaveBeenNthCalledWith(6, '_scw_rgpd_hash', '913003917', { ...cookieOptions, maxAge: 15552000, - path: '/', }) }) @@ -241,36 +239,4 @@ describe('CookieConsent - CookieConsentProvider', () => { 'Salesforce custom destination (Scaleway)': true, }) }) - - it('should delete a cookie correctly with appropriate options', () => { - const spy = jest.spyOn(cookie, 'serialize') - - const { result } = renderHook(() => useCookieConsent(), { - wrapper: wrapper({ - isConsentRequired: true, - essentialIntegrations: ['Deskpro', 'Stripe', 'Sentry'], - config: { - segment: { - cdnURL: 'url', - writeKey: 'key', - }, - }, - }), - }) - - act(() => { - result.current.saveConsent({ marketing: false }) - }) - - const expectedDeleteCookieOptions = { - ...COOKIES_OPTIONS, - expires: expect.any(Date), - } - - expect(spy).toHaveBeenCalledWith( - '_scw_rgpd_marketing', - '', - expectedDeleteCookieOptions, - ) - }) }) diff --git a/packages/cookie-consent/src/CookieConsentProvider/index.tsx b/packages/cookie-consent/src/CookieConsentProvider/index.tsx index ef5a15d92..9e2c05d19 100644 --- a/packages/cookie-consent/src/CookieConsentProvider/index.tsx +++ b/packages/cookie-consent/src/CookieConsentProvider/index.tsx @@ -1,7 +1,6 @@ export { CookieConsentProvider, useCookieConsent, - COOKIES_OPTIONS, } from './CookieConsentProvider' export type { CategoryKind, Consent } from './types' export { useSegmentIntegrations } from './useSegmentIntegrations'