Skip to content

Commit

Permalink
Merge pull request #23 from jorbush/policies
Browse files Browse the repository at this point in the history
Add cookies and privacy policies
  • Loading branch information
jorbush authored Aug 15, 2024
2 parents 66b131c + c7b4b1e commit 182378b
Show file tree
Hide file tree
Showing 13 changed files with 926 additions and 15 deletions.
10 changes: 8 additions & 2 deletions __tests__/unit_test/components/Footer.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,19 @@ describe('<Footer />', () => {
it('renders the Footer component', () => {
render(<Footer />);
expect(screen.getByText(/version 0.5/)).toBeDefined();
expect(screen.getByText(/contact jbonetv5@gmail.com/)).toBeDefined();
expect(screen.getByText(/contact: jbonetv5@gmail.com/)).toBeDefined();
});

it('uses the useTranslation hook', () => {
render(<Footer />);
expect(screen.getByText('version 0.5')).toBeDefined();
expect(screen.getByText('contact jbonetv5@gmail.com')).toBeDefined();
expect(screen.getByText('contact: jbonetv5@gmail.com')).toBeDefined();
});

it('renders the privacy policy and cookies policy links', () => {
render(<Footer />);
expect(screen.getByText('privacy_policy')).toBeDefined();
expect(screen.getByText('cookies_policy')).toBeDefined();
});

it('applies the correct CSS classes', () => {
Expand Down
83 changes: 83 additions & 0 deletions __tests__/unit_test/pages/policies/cookies/cookies.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import { describe, it, expect, vi, afterEach } from 'vitest';
import { render, cleanup } from '@testing-library/react';
import CookiesPolicy from '@/app/policies/cookies/cookies';

// Mock the next/navigation module
vi.mock('next/navigation', () => ({
useRouter: () => ({
back: vi.fn(),
}),
}));

// Mock the react-i18next module
vi.mock('react-i18next', () => ({
useTranslation: () => ({
t: (key: string) => key,
}),
}));

describe('CookiesPolicy', () => {
afterEach(() => {
cleanup();
});

it('renders the cookies policy content', () => {
const { getByText } = render(<CookiesPolicy />);

expect(getByText('cookies_policy')).toBeDefined();
expect(getByText('what_are_cookies')).toBeDefined();
expect(getByText('types_of_cookies')).toBeDefined();
expect(getByText('essential_technical_cookies')).toBeDefined();
expect(getByText('third_party_services')).toBeDefined();
expect(getByText('how_to_manage_cookies')).toBeDefined();
expect(getByText('changes_in_cookies_policy')).toBeDefined();
expect(getByText('contact')).toBeDefined();
});

it('has a back button that calls router.back()', () => {
const { getByRole } = render(<CookiesPolicy />);

const backButton = getByRole('button');
expect(backButton).toBeDefined();
});

it('contains links to external services', () => {
const { getByText } = render(<CookiesPolicy />);

expect(getByText('Google SSO')).toBeDefined();
expect(getByText('GitHub SSO')).toBeDefined();
expect(getByText('Vercel')).toBeDefined();
expect(getByText('GoDaddy')).toBeDefined();
expect(getByText('MongoDB')).toBeDefined();
expect(getByText('Cloudinary')).toBeDefined();
});

it('contains links to privacy policies', () => {
const { getByText } = render(<CookiesPolicy />);

expect(getByText('vercel_privacy_policy')).toBeDefined();
expect(getByText('godaddy_privacy_policy')).toBeDefined();
expect(getByText('mongodb_privacy_policy')).toBeDefined();
expect(getByText('cloudinary_privacy_policy')).toBeDefined();
});

it('contains email contact information', () => {
const { getByText } = render(<CookiesPolicy />);

const emailLink = getByText('jbonetv5@gmail.com');
expect(emailLink).toBeDefined();
expect(emailLink.getAttribute('href')).toBe(
'mailto:jbonetv5@gmail.com'
);
});

it('contains a link to the privacy policy', () => {
const { getByText } = render(<CookiesPolicy />);

const privacyPolicyLink = getByText('privacy_policy');
expect(privacyPolicyLink).toBeDefined();
expect(privacyPolicyLink.getAttribute('href')).toBe(
'/policies/privacy'
);
});
});
29 changes: 29 additions & 0 deletions __tests__/unit_test/pages/policies/cookies/page.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { describe, it, expect, vi } from 'vitest';
import { render } from '@testing-library/react';
import CookiesPolicyPage from '@/app/policies/cookies/page';

// Mock the ClientOnly component
vi.mock('@/app/components/ClientOnly', () => ({
default: ({ children }: { children: React.ReactNode }) => (
<div data-testid="client-only">{children}</div>
),
}));

// Mock the CookiesPolicy component
vi.mock('@/app/policies/cookies/cookies', () => ({
default: () => (
<div data-testid="cookies-policy">Mocked Cookies Policy</div>
),
}));

describe('CookiesPolicyPage', () => {
it('renders CookiesPolicy wrapped in ClientOnly', () => {
const { getByTestId } = render(<CookiesPolicyPage />);

const clientOnlyWrapper = getByTestId('client-only');
expect(clientOnlyWrapper).toBeDefined();

const cookiesPolicyComponent = getByTestId('cookies-policy');
expect(cookiesPolicyComponent).toBeDefined();
});
});
29 changes: 29 additions & 0 deletions __tests__/unit_test/pages/policies/privacy/page.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { describe, it, expect, vi } from 'vitest';
import { render } from '@testing-library/react';
import PrivacyPolicyPage from '@/app/policies/privacy/page';

// Mock the ClientOnly component
vi.mock('@/app/components/ClientOnly', () => ({
default: ({ children }: { children: React.ReactNode }) => (
<div data-testid="client-only">{children}</div>
),
}));

// Mock the PrivacyPolicy component
vi.mock('@/app/policies/privacy/privacy', () => ({
default: () => (
<div data-testid="privacy-policy">Mocked Privacy Policy</div>
),
}));

describe('PrivacyPolicyPage', () => {
it('renders PrivacyPolicy wrapped in ClientOnly', () => {
const { getByTestId } = render(<PrivacyPolicyPage />);

const clientOnlyWrapper = getByTestId('client-only');
expect(clientOnlyWrapper).toBeDefined();

const privacyPolicyComponent = getByTestId('privacy-policy');
expect(privacyPolicyComponent).toBeDefined();
});
});
62 changes: 62 additions & 0 deletions __tests__/unit_test/pages/policies/privacy/privacy.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { describe, it, expect, vi, afterEach } from 'vitest';
import { render, cleanup } from '@testing-library/react';
import PrivacyPolicy from '@/app/policies/privacy/privacy';

// Mock the next/navigation module
vi.mock('next/navigation', () => ({
useRouter: () => ({
back: vi.fn(),
}),
}));

// Mock the react-i18next module
vi.mock('react-i18next', () => ({
useTranslation: () => ({
t: (key: string) => key,
}),
}));

describe('PrivacyPolicy', () => {
afterEach(() => {
cleanup();
});
it('renders the privacy policy content', () => {
const { getByText } = render(<PrivacyPolicy />);

expect(getByText('privacy_policy')).toBeDefined();
expect(getByText('information_we_collect')).toBeDefined();
expect(getByText('how_we_use_info')).toBeDefined();
expect(getByText('sharing_info')).toBeDefined();
expect(getByText('data_security')).toBeDefined();
expect(getByText('your_rights')).toBeDefined();
expect(getByText('data_retention')).toBeDefined();
expect(getByText('policy_changes')).toBeDefined();
expect(getByText('8. contact')).toBeDefined();
});

it('has a back button that calls router.back()', () => {
const { getByRole } = render(<PrivacyPolicy />);

const backButton = getByRole('button');
expect(backButton).toBeDefined();
});

it('contains links to external services', () => {
const { getAllByText, getByText } = render(<PrivacyPolicy />);

expect(getAllByText('Cloudinary')).toBeDefined();
expect(getByText('Vercel')).toBeDefined();
expect(getByText('GoDaddy')).toBeDefined();
expect(getByText('MongoDB')).toBeDefined();
});

it('contains email contact information', () => {
const { getAllByText } = render(<PrivacyPolicy />);

const emailLinks = getAllByText('jbonetv5@gmail.com');
expect(emailLinks.length).toBe(2);
emailLinks.forEach((link) => {
expect(link.getAttribute('href')).toBe('mailto:jbonetv5@gmail.com');
});
});
});
21 changes: 17 additions & 4 deletions app/components/Footer.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,30 @@
'use client';

import { useTranslation } from 'react-i18next';
import useTheme from '../hooks/useTheme';
import useTheme from '@/app/hooks/useTheme';
import Link from 'next/link';

const Footer = () => {
const { t } = useTranslation();

useTheme();

return (
<div className="flex w-full flex-col items-center justify-center p-4 text-neutral-200 dark:text-gray-600">
<div>{`${t('version')} 0.5`}</div>
<div>{`${t('contact')} jbonetv5@gmail.com`}</div>
<div>{`${t('contact')}: jbonetv5@gmail.com`}</div>
<div className="flex flex-row items-center space-x-4 space-y-0">
<Link
href="/policies/privacy"
className="hover:underline"
>
{t('privacy_policy')}
</Link>
<Link
href="/policies/cookies"
className="hover:underline"
>
{t('cookies_policy')}
</Link>
</div>
</div>
);
};
Expand Down
Loading

0 comments on commit 182378b

Please sign in to comment.