✅ test: fix failing unit tests

This commit is contained in:
2026-02-09 16:16:29 +01:00
parent ef00d37351
commit 527203c635
17 changed files with 104 additions and 280 deletions
+2 -9
View File
@@ -1,20 +1,13 @@
import { render, screen } from '@testing-library/react' import { render, screen } from '@testing-library/react'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { useAnalytics } from 'use-analytics'
import App from './App' import App from './App.js'
// Mock the analytics module
vi.mock('use-analytics', () => ({
useAnalytics: () => ({ plugins: { enable: vi.fn(), disable: vi.fn() }, page: vi.fn() }),
}))
describe('App component', () => { describe('App component', () => {
test('renders MainPage without crashing', async () => { test('renders MainPage without crashing', async () => {
render(<App />) render(<App />)
expect(screen.getByLabelText('loading-screen')).toBeInTheDocument() expect(screen.getByLabelText('loading-screen')).toBeInTheDocument()
expect(await screen.findByText('Robotics Engineer')).toBeInTheDocument() expect(await screen.findByText("Compagnia d'Arme del Santo Luca")).toBeInTheDocument()
expect(screen.queryByLabelText('loading-screen')).not.toBeInTheDocument() expect(screen.queryByLabelText('loading-screen')).not.toBeInTheDocument()
}) })
}) })
@@ -7,8 +7,8 @@ import * as IconLinks from './index.js'
const labels: { [key: string]: string } = { const labels: { [key: string]: string } = {
DescriptionIconLink: 'Doc-button', DescriptionIconLink: 'Doc-button',
EmailIconLink: 'Email-button', EmailIconLink: 'Email-button',
GitHubIconLink: 'GitHub-button', InstagramIconLink: 'Instagram-button',
LinkedInIconLink: 'LinkedIn-button', FacebookIconLink: 'Facebook-button',
AcademyIconLink: 'Academy-button', AcademyIconLink: 'Academy-button',
VideoIconLink: 'Video-button', VideoIconLink: 'Video-button',
ExternalIconLink: 'External-link-button', ExternalIconLink: 'External-link-button',
+1 -1
View File
@@ -56,7 +56,7 @@ const IconWrapper: React.FC<IconWrapperProps> = ({ index, fontSize, Icon, sx, ..
export const DescriptionIconLink = (props: IconLinkProps) => <IconWrapper aria-label="Doc-button" Icon={Description} {...props} /> export const DescriptionIconLink = (props: IconLinkProps) => <IconWrapper aria-label="Doc-button" Icon={Description} {...props} />
export const EmailIconLink = (props: IconLinkProps) => <IconWrapper aria-label="Email-button" Icon={Email} {...props} /> export const EmailIconLink = (props: IconLinkProps) => <IconWrapper aria-label="Email-button" Icon={Email} {...props} />
export const InstagramIconLink = (props: IconLinkProps) => <IconWrapper aria-label="Instagram-button" Icon={Instagram} {...props} /> export const InstagramIconLink = (props: IconLinkProps) => <IconWrapper aria-label="Instagram-button" Icon={Instagram} {...props} />
export const FacebookIconLink = (props: IconLinkProps) => <IconWrapper aria-label="LinkedIn-button" Icon={Facebook} {...props} /> export const FacebookIconLink = (props: IconLinkProps) => <IconWrapper aria-label="Facebook-button" Icon={Facebook} {...props} />
export const AcademyIconLink = (props: IconLinkProps) => <IconWrapper aria-label="Academy-button" Icon={School} {...props} /> export const AcademyIconLink = (props: IconLinkProps) => <IconWrapper aria-label="Academy-button" Icon={School} {...props} />
export const VideoIconLink = (props: IconLinkProps) => <IconWrapper aria-label="Video-button" Icon={OndemandVideo} {...props} /> export const VideoIconLink = (props: IconLinkProps) => <IconWrapper aria-label="Video-button" Icon={OndemandVideo} {...props} />
export const ExternalIconLink = (props: IconLinkProps) => <IconWrapper aria-label="External-link-button" Icon={OpenInNew} {...props} /> export const ExternalIconLink = (props: IconLinkProps) => <IconWrapper aria-label="External-link-button" Icon={OpenInNew} {...props} />
@@ -1,6 +1,4 @@
import { render, screen, fireEvent } from '@testing-library/react' import { render, screen, fireEvent } from '@testing-library/react'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { useAnalytics } from 'use-analytics'
import CookieConsent from './index.js' import CookieConsent from './index.js'
@@ -1,89 +0,0 @@
import { screen, fireEvent } from '@testing-library/react'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { useAnalytics } from 'use-analytics'
import { renderWithRouter as render } from 'components/utils/tests/index.js'
import CookiePreferences from './index.js'
// Mock the analytics module
const analytics = { plugins: { enable: vi.fn(), disable: vi.fn() } }
vi.mock('use-analytics', () => ({
useAnalytics: () => analytics,
}))
// Mock localStorage
const localStorageMock = (() => {
let store: Record<string, string> = {}
return {
getItem: vi.fn((key: string) => store[key] || null),
setItem: vi.fn((key: string, value: string) => {
store[key] = value
}),
clear: vi.fn(() => {
store = {}
}),
}
})()
Object.defineProperty(window, 'localStorage', { value: localStorageMock })
describe('CookiePreferences', () => {
beforeEach(() => {
vi.clearAllMocks()
localStorageMock.clear()
})
it('accepts all cookies when clicking Accept All', () => {
render(<CookiePreferences />)
expect(screen.getByText('Cookie Preferences')).toBeInTheDocument()
fireEvent.click(screen.getByText('Accept All'))
fireEvent.click(screen.getByText('Save Preferences'))
expect(localStorageMock.setItem).toHaveBeenCalledWith('m-tartari-cookie-consent', JSON.stringify({ necessary: true, analytics: true }))
expect(analytics.plugins.disable).not.toHaveBeenCalled()
expect(analytics.plugins.enable).toHaveBeenCalled()
})
it('rejects analytics cookies when clicking Reject All', () => {
render(<CookiePreferences />)
expect(screen.getByText('Cookie Preferences')).toBeInTheDocument()
fireEvent.click(screen.getByText('Reject All'))
fireEvent.click(screen.getByText('Save Preferences'))
expect(localStorageMock.setItem).toHaveBeenCalledWith('m-tartari-cookie-consent', JSON.stringify({ necessary: true, analytics: false }))
expect(analytics.plugins.enable).not.toHaveBeenCalled()
expect(analytics.plugins.disable).toHaveBeenCalled()
})
it('toggles analytics cookies when clicking the Analytics button', () => {
render(<CookiePreferences />)
expect(screen.getByText('Cookie Preferences')).toBeInTheDocument()
fireEvent.click(screen.getByLabelText('analytics-cookies-toggle'))
fireEvent.click(screen.getByText('Save Preferences'))
expect(localStorageMock.setItem).toHaveBeenCalledWith('m-tartari-cookie-consent', JSON.stringify({ necessary: true, analytics: true }))
expect(analytics.plugins.disable).not.toHaveBeenCalled()
expect(analytics.plugins.enable).toHaveBeenCalled()
})
it('renders the cookie consent in the right state when consent in local storage', () => {
localStorageMock.getItem.mockReturnValueOnce(JSON.stringify({ necessary: true, analytics: true }))
render(<CookiePreferences />)
expect(screen.getByText('Cookie Preferences')).toBeInTheDocument()
fireEvent.click(screen.getByLabelText('analytics-cookies-toggle'))
fireEvent.click(screen.getByText('Save Preferences'))
expect(localStorageMock.setItem).toHaveBeenCalledWith('m-tartari-cookie-consent', JSON.stringify({ necessary: true, analytics: false }))
expect(analytics.plugins.enable).not.toHaveBeenCalled()
expect(analytics.plugins.disable).toHaveBeenCalled()
})
})
@@ -11,7 +11,7 @@ const CookieConsent: React.FC<CookieConsentProps> = () => {
return ( return (
<Box id="cookie-preferences" aria-labelledby="cookie-preferences-title" aria-describedby="cookie-preferences-description"> <Box id="cookie-preferences" aria-labelledby="cookie-preferences-title" aria-describedby="cookie-preferences-description">
<SectionHeader color="inherit" id="cookie-preferences-title" aria-label="cookie-preferences"> <SectionHeader color="inherit" id="cookie-preferences-title" aria-label="cookie-preferences">
Cookie policy Cookie Policy
</SectionHeader> </SectionHeader>
<Typography component="p" color="textSecondary"> <Typography component="p" color="textSecondary">
@@ -1,24 +1,16 @@
import React from 'react' import React from 'react'
import { screen } from '@testing-library/react' import { screen } from '@testing-library/react'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { useAnalytics } from 'use-analytics'
import { renderWithRouter as render } from 'components/utils/tests/index.js' import { renderWithRouter as render } from 'components/utils/tests/index.js'
import Footer from './index.js' import Footer from './index.js'
// Mock the analytics module
const analytics = { plugins: { enable: vi.fn(), disable: vi.fn() } }
vi.mock('use-analytics', () => ({
useAnalytics: () => analytics,
}))
describe('Footer', () => { describe('Footer', () => {
it('renders the Footer', async () => { it('renders the Footer', async () => {
render(<Footer />) render(<Footer />)
expect(screen.getAllByText('Privacy Policy')).toHaveLength(2) // link and dialog expect(screen.getAllByText('Privacy Policy')).toHaveLength(1) // link and dialog
expect(screen.getAllByText('Cookie Preferences')).toHaveLength(2) // link and dialog expect(screen.getAllByText('Cookie Preferences')).toHaveLength(1) // link only
}) })
it('does not show the dialog if the `showCookieConsent` prop is false', () => { it('does not show the dialog if the `showCookieConsent` prop is false', () => {
@@ -1,19 +1,10 @@
import React from 'react'
import { render, screen } from '@testing-library/react' import { render, screen } from '@testing-library/react'
import { BrowserRouter } from 'react-router-dom'
import PrivacyPolicy from './index.js' import PrivacyPolicy from './index.js'
describe('Privacy Policy', () => { describe('Privacy Policy', () => {
it('renders the Privacy Policy page', async () => { it('renders the Privacy Policy page', async () => {
render( render(<PrivacyPolicy />)
<BrowserRouter>
<PrivacyPolicy />
</BrowserRouter>
)
expect(screen.getByText('Privacy Policy')).toBeInTheDocument() expect(screen.getByText('Privacy Policy')).toBeInTheDocument()
expect(screen.getByText('Google Analytics')).toBeInTheDocument()
expect(screen.getByText('Your Rights')).toBeInTheDocument()
expect(screen.getByText('Contact Us')).toBeInTheDocument()
}) })
}) })
@@ -12,87 +12,83 @@ const List = styled(MuiList)(({ theme }) => ({
}, },
})) }))
const PrivacyPolicy: React.FC = () => { const PrivacyPolicy = () => (
return ( <Box aria-labelledby="privacy-policy">
<Box aria-labelledby="privacy-policy"> <SectionHeader id="privacy-policy" aria-label="privacy-policy" color="inherit">
<SectionHeader id="privacy-policy" aria-label="privacy-policy" color="inherit"> Privacy Policy
Privacy Policy </SectionHeader>
</SectionHeader> <Typography variant="subtitle1" color="textSecondary" component="p" pb={4}>
<Typography variant="subtitle1" color="textSecondary" component="p" pb={4}> Data ultimo aggiornamento: Feb. 1, 2026
Data ultimo aggiornamento: Feb. 1, 2026 </Typography>
</Typography>
<SectionSubheader>Introduction</SectionSubheader> <SectionSubheader>Introduction</SectionSubheader>
<Typography component="p" color="textSecondary"> <Typography component="p" color="textSecondary">
L'informativa è resa solo per il sito web ufficiale di la Compagnia d'Arme del Santo Luca all'indirizzo https://{window.location.host} e non L'informativa è resa solo per il sito web ufficiale di la Compagnia d'Arme del Santo Luca all'indirizzo https://{window.location.host} e non per
per altri siti web esterni, eventualmente consultati dall'utente tramite link. altri siti web esterni, eventualmente consultati dall'utente tramite link.
</Typography> </Typography>
<SectionSubheader sx={{ mt: 4 }}>Titolare del trattamento</SectionSubheader> <SectionSubheader sx={{ mt: 4 }}>Titolare del trattamento</SectionSubheader>
<Typography component="p" color="textSecondary"> <Typography component="p" color="textSecondary">
Il Titolare del trattamento è la Compagnia d'Arme del Santo Luca, con sede legale in via Leonello Poletti n. 16, 44122 Ferrara. Il Titolare del trattamento è la Compagnia d'Arme del Santo Luca, con sede legale in via Leonello Poletti n. 16, 44122 Ferrara.
</Typography> </Typography>
<SectionSubheader sx={{ mt: 4 }}> Responsabile Protezione Dati (DPO)</SectionSubheader> <SectionSubheader sx={{ mt: 4 }}> Responsabile Protezione Dati (DPO)</SectionSubheader>
<Typography component="p" color="textSecondary"> <Typography component="p" color="textSecondary">
Il Titolare, la Compagnia d'Arme del Santo Luca ente di diritto privato senza fine di lucro, ai sensi dell'art. 37 GDPR, non è tenuto a Il Titolare, la Compagnia d'Arme del Santo Luca ente di diritto privato senza fine di lucro, ai sensi dell'art. 37 GDPR, non è tenuto a nominare
nominare il Responsabile della protezione dei dati. il Responsabile della protezione dei dati.
</Typography> </Typography>
<SectionSubheader sx={{ mt: 4 }}>Tipi di dati trattati (Dati di navigazione)</SectionSubheader> <SectionSubheader sx={{ mt: 4 }}>Tipi di dati trattati (Dati di navigazione)</SectionSubheader>
<Typography component="p" color="textSecondary" gutterBottom> <Typography component="p" color="textSecondary" gutterBottom>
I sistemi informatici e le procedure software preposte al funzionamento di questo sito web acquisiscono, nel corso del loro normale esercizio, I sistemi informatici e le procedure software preposte al funzionamento di questo sito web acquisiscono, nel corso del loro normale esercizio,
alcuni dati personali la cui trasmissione è implicita nell'uso dei protocolli di comunicazione di Internet. Si tratta di informazioni che non alcuni dati personali la cui trasmissione è implicita nell'uso dei protocolli di comunicazione di Internet. Si tratta di informazioni che non
sono raccolte per essere associate a interessati identificati, ma che per loro stessa natura potrebbero, attraverso elaborazioni ed sono raccolte per essere associate a interessati identificati, ma che per loro stessa natura potrebbero, attraverso elaborazioni ed associazioni
associazioni con dati detenuti da terzi, permettere di identificare gli utenti. In questa categoria di dati rientrano gli indirizzi IP o i con dati detenuti da terzi, permettere di identificare gli utenti. In questa categoria di dati rientrano gli indirizzi IP o i nomi a dominio dei
nomi a dominio dei computer utilizzati dagli utenti che si connettono al sito, gli indirizzi in notazione URI (Uniform Resource Identifier) computer utilizzati dagli utenti che si connettono al sito, gli indirizzi in notazione URI (Uniform Resource Identifier) delle risorse
delle risorse richieste, l'orario della richiesta, il metodo utilizzato nel sottoporre la richiesta al server, la dimensione del file ottenuto richieste, l'orario della richiesta, il metodo utilizzato nel sottoporre la richiesta al server, la dimensione del file ottenuto in risposta, il
in risposta, il codice numerico indicante lo stato della risposta data dal server (buon fine, errore, ecc.) ed altri parametri relativi al codice numerico indicante lo stato della risposta data dal server (buon fine, errore, ecc.) ed altri parametri relativi al sistema operativo e
sistema operativo e all'ambiente informatico dell'utente. all'ambiente informatico dell'utente.
</Typography> </Typography>
<Typography component="p" color="textSecondary"> <Typography component="p" color="textSecondary">
I suddetti dati sono necessari per la fruizione della navigazione del sito. Questi dati vengono conservati dal provider per il tempo I suddetti dati sono necessari per la fruizione della navigazione del sito. Questi dati vengono conservati dal provider per il tempo
strettamente necessario. I dati potrebbero essere utilizzati per l'accertamento di responsabilità in caso di ipotetici reati informatici ai strettamente necessario. I dati potrebbero essere utilizzati per l'accertamento di responsabilità in caso di ipotetici reati informatici ai
danni del sito. danni del sito.
</Typography> </Typography>
<SectionSubheader sx={{ mt: 4 }}>Modalità del trattamento</SectionSubheader> <SectionSubheader sx={{ mt: 4 }}>Modalità del trattamento</SectionSubheader>
<Typography component="p" color="textSecondary"> <Typography component="p" color="textSecondary">
I dati personali di navigazione sono trattati con strumenti automatizzati per il tempo strettamente necessario a conseguire gli scopi per cui I dati personali di navigazione sono trattati con strumenti automatizzati per il tempo strettamente necessario a conseguire gli scopi per cui
sono stati raccolti. I dati personali di contatto sono trattati con strumenti cartacei e informatici e vengono conservati fino a completa sono stati raccolti. I dati personali di contatto sono trattati con strumenti cartacei e informatici e vengono conservati fino a completa
esecuzione del rapporto precontrattuale e di quello contrattuale o per quanto necessario secondo termini di legge. Specifiche misure di esecuzione del rapporto precontrattuale e di quello contrattuale o per quanto necessario secondo termini di legge. Specifiche misure di
sicurezza sono osservate per prevenire la perdita dei dati, usi illeciti o non corretti ed accessi non autorizzati. sicurezza sono osservate per prevenire la perdita dei dati, usi illeciti o non corretti ed accessi non autorizzati.
</Typography> </Typography>
<SectionSubheader sx={{ mt: 4 }}>Diritti di accesso e reclamo</SectionSubheader> <SectionSubheader sx={{ mt: 4 }}>Diritti di accesso e reclamo</SectionSubheader>
<Typography component="p" color="textSecondary"> <Typography component="p" color="textSecondary">
Scrivendo attraverso il modulo di contatto le è garantito il diritto di: Scrivendo attraverso il modulo di contatto le è garantito il diritto di:
</Typography> </Typography>
<List dense> <List dense>
<ListItemText>chiedere l'esistenza e l'accesso ai dati che la riguardano;</ListItemText> <ListItemText>chiedere l'esistenza e l'accesso ai dati che la riguardano;</ListItemText>
<ListItemText>chiedere l'aggiornamento e l'integrazione dei dati forniti;</ListItemText> <ListItemText>chiedere l'aggiornamento e l'integrazione dei dati forniti;</ListItemText>
<ListItemText> <ListItemText>
chiedere la cancellazione dei dati personali, salva l'esistenza di un diritto del Titolare alla conservazione degli stessi chiedere la cancellazione dei dati personali, salva l'esistenza di un diritto del Titolare alla conservazione degli stessi
</ListItemText> </ListItemText>
<ListItemText> <ListItemText>chiedere la comunicazione dei dati personali conservati eventualmente dal Titolare o la consegna di una loro copia;</ListItemText>
chiedere la comunicazione dei dati personali conservati eventualmente dal Titolare o la consegna di una loro copia; <ListItemText>opporsi ad operazioni di trattamento che ritenga non siano legittime o chiedere limitazioni di trattamento</ListItemText>
</ListItemText> <ListItemText>
<ListItemText>opporsi ad operazioni di trattamento che ritenga non siano legittime o chiedere limitazioni di trattamento</ListItemText> Per l'esercizio dei suddetti diritti la legittimità della sua richiesta potrà essere valutata previa verifica della sua identità.
<ListItemText> </ListItemText>
Per l'esercizio dei suddetti diritti la legittimità della sua richiesta potrà essere valutata previa verifica della sua identità. </List>
</ListItemText>
</List>
<Typography component="p" color="textSecondary"> <Typography component="p" color="textSecondary">
Qualora ritenga che il trattamento abbia violato un suo diritto potrà presentare obiezioni nei confronti del Titolare utilizzando l'indirizzo Qualora ritenga che il trattamento abbia violato un suo diritto potrà presentare obiezioni nei confronti del Titolare utilizzando l'indirizzo
sopra indicato e anche presentando reclamo presso l'Autorità Garante{' '} sopra indicato e anche presentando reclamo presso l'Autorità Garante{' '}
<Link color="textPrimary" href="https://www.garanteprivacy.it" target="_blank" rel="noopener noreferrer"> <Link color="textPrimary" href="https://www.garanteprivacy.it" target="_blank" rel="noopener noreferrer">
www.garanteprivacy.it www.garanteprivacy.it
</Link> </Link>
. .
</Typography> </Typography>
</Box> </Box>
) )
}
export default PrivacyPolicy export default PrivacyPolicy
@@ -1,7 +1,5 @@
import { screen } from '@testing-library/react' import { screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event' import userEvent from '@testing-library/user-event'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { useAnalytics } from 'use-analytics'
import { renderWithRouter as render } from 'components/utils/tests/index.js' import { renderWithRouter as render } from 'components/utils/tests/index.js'
import BusinessCardPage from './index.js' import BusinessCardPage from './index.js'
@@ -13,17 +11,13 @@ vi.mock('./envVars.js', () => ({
PHONE: '+123456789', PHONE: '+123456789',
EMAIL: 'test@example.com', EMAIL: 'test@example.com',
FACEBOOK: 'testfacebook', FACEBOOK: 'testfacebook',
INSTAGRAM: 'testinstagram',
})) }))
// Mock window.print // Mock window.print
const mockPrint = vi.fn() const mockPrint = vi.fn()
window.print = mockPrint window.print = mockPrint
// Mock the analytics module
vi.mock('use-analytics', () => ({
useAnalytics: () => ({ plugins: { enable: vi.fn(), disable: vi.fn() } }),
}))
describe('BusinessCardPage', () => { describe('BusinessCardPage', () => {
beforeEach(() => { beforeEach(() => {
mockPrint.mockClear() mockPrint.mockClear()
@@ -33,15 +27,15 @@ describe('BusinessCardPage', () => {
render(<BusinessCardPage />) render(<BusinessCardPage />)
// Name appears in uppercase in the first card // Name appears in uppercase in the first card
expect(screen.getAllByText('Test Name')).toHaveLength(2) expect(screen.getByText('Test Name')).toBeInTheDocument()
expect(screen.getByText('Test Position')).toBeInTheDocument() expect(screen.getByText('Test Position')).toBeInTheDocument()
// Check if values are rendered correctly in the second card // Check if values are rendered correctly in the second card
expect(screen.getByText('Test VAT')).toBeInTheDocument()
expect(screen.getByText('+123456789')).toBeInTheDocument() expect(screen.getByText('+123456789')).toBeInTheDocument()
expect(screen.getByText('test@example.com')).toBeInTheDocument() expect(screen.getByText('test@example.com')).toBeInTheDocument()
expect(screen.getByText('www.m-tartari.eu')).toBeInTheDocument() expect(screen.getByText('www.compagniadarmedelsantoluca.it')).toBeInTheDocument()
expect(screen.getByText('testlinkedin')).toBeInTheDocument() expect(screen.getByText('@testinstagram')).toBeInTheDocument()
expect(screen.getByText('@testfacebook')).toBeInTheDocument()
}) })
it('has correct links with proper href attributes', () => { it('has correct links with proper href attributes', () => {
@@ -56,12 +50,12 @@ describe('BusinessCardPage', () => {
expect(emailLink).toHaveAttribute('href', 'mailto:test@example.com') expect(emailLink).toHaveAttribute('href', 'mailto:test@example.com')
// Check website link // Check website link
const websiteLink = screen.getByText('www.m-tartari.eu').closest('a') const websiteLink = screen.getByText('www.compagniadarmedelsantoluca.it').closest('a')
expect(websiteLink).toHaveAttribute('href', 'https://www.m-tartari.eu') expect(websiteLink).toHaveAttribute('href', 'https://www.compagniadarmedelsantoluca.it/')
// Check Facebook Link // Check Facebook Link
const linkedinLink = screen.getByText('testlinkedin').closest('a') const linkedinLink = screen.getByText('@testfacebook').closest('a')
expect(linkedinLink).toHaveAttribute('href', 'https://www.linkedin.com/in/testlinkedin/') expect(linkedinLink).toHaveAttribute('href', 'https://facebook.com/testfacebook/')
}) })
it('calls window.print when print button is clicked', async () => { it('calls window.print when print button is clicked', async () => {
@@ -1,21 +1,14 @@
import { screen } from '@testing-library/react' import { screen } from '@testing-library/react'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { useAnalytics } from 'use-analytics'
import { renderWithRouter as render } from 'components/utils/tests/index.js' import { renderWithRouter as render } from 'components/utils/tests/index.js'
import ContactPage from './index.js' import ContactPage from './index.js'
// Mock the analytics module
vi.mock('use-analytics', () => ({
useAnalytics: () => ({ plugins: { enable: vi.fn(), disable: vi.fn() } }),
}))
vi.stubGlobal('open', vi.fn()) vi.stubGlobal('open', vi.fn())
describe('ContactPage', () => { describe('ContactPage', () => {
test('renders without crashing and displays the correct contact methods', () => { test('renders without crashing and displays the correct contact methods', () => {
render(<ContactPage />) render(<ContactPage />)
expect(screen.getAllByText('Contacts')).toHaveLength(2) // Page title and the Appbar drawer link expect(screen.getAllByText('Contatti')).toHaveLength(2) // Page title and the Appbar drawer link
expect(screen.getByLabelText('Email link')).toBeInTheDocument() expect(screen.getByLabelText('Email link')).toBeInTheDocument()
expect(screen.getByLabelText('Facebook Link')).toBeInTheDocument() expect(screen.getByLabelText('Facebook Link')).toBeInTheDocument()
expect(screen.getByLabelText('Instagram link')).toBeInTheDocument() expect(screen.getByLabelText('Instagram link')).toBeInTheDocument()
@@ -1,15 +1,8 @@
import { screen, render } from '@testing-library/react' import { screen, render } from '@testing-library/react'
import { RouterProvider, createMemoryRouter } from 'react-router-dom' import { RouterProvider, createMemoryRouter } from 'react-router-dom'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { useAnalytics } from 'use-analytics'
import ErrorPage from './index.js' import ErrorPage from './index.js'
// Mock the analytics module
vi.mock('use-analytics', () => ({
useAnalytics: () => ({ plugins: { enable: vi.fn(), disable: vi.fn() } }),
}))
// Suppress console.error messages during tests // Suppress console.error messages during tests
const originalConsoleError = console.error const originalConsoleError = console.error
console.error = vi.fn() console.error = vi.fn()
@@ -1,27 +1,20 @@
import { screen } from '@testing-library/react' import { screen } from '@testing-library/react'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { useAnalytics } from 'use-analytics'
import { renderWithRouter as render } from 'components/utils/tests/index.js' import { renderWithRouter as render } from 'components/utils/tests/index.js'
import MainPage from '.' import MainPage from '.'
// Mock the analytics module
vi.mock('use-analytics', () => ({
useAnalytics: () => ({ plugins: { enable: vi.fn(), disable: vi.fn() } }),
}))
// Tests // Tests
describe('Main page', () => { describe('Main page', () => {
it('Should render the page correctly on desktop', async () => { it('Should render the page correctly on desktop', async () => {
await render(<MainPage />) await render(<MainPage />)
// Make sure the page title is correct // Make sure the page title is correct
expect(screen.getByText('Robotics Engineer')).toBeInTheDocument() expect(await screen.findByText("Compagnia d'Arme del Santo Luca")).toBeInTheDocument()
// Make sure the project spotlights are present for both desktop and mobile // Make sure the project spotlights are present for both desktop and mobile
expect(screen.getAllByText('LINFA: An Intuitive Block-Programming Interface for Reconfigurable Robots')).toHaveLength(2) expect(screen.getAllByText('Chi Siamo')).toHaveLength(2)
expect(screen.getAllByText("Revamping HHCM's Modular: Swift Generation of Modular Robot Models")).toHaveLength(2) expect(screen.getAllByText('Vita Civile')).toHaveLength(2)
expect(screen.getAllByText('Automated Actuators and Robotic Modules Calibration')).toHaveLength(2) expect(screen.getAllByText('Attività Didattiche')).toHaveLength(2)
expect(screen.getAllByText('Voice Controlled Mobile Robot for Indoor Applications')).toHaveLength(2) expect(screen.getAllByText('Vita Militare')).toHaveLength(2)
}) })
}) })
+2 -2
View File
@@ -48,7 +48,7 @@ const MainPage = () => {
</Typography> </Typography>
<Typography variant="h4" pt={3}> <Typography variant="h4" pt={3}>
Attività didattiche Attività Didattiche
</Typography> </Typography>
<Typography pt={2}> <Typography pt={2}>
La Compagnia propone percorsi didattici dedicati alla scoperta della vita nel Basso Medioevo, illustrando le attività svolte all'interno La Compagnia propone percorsi didattici dedicati alla scoperta della vita nel Basso Medioevo, illustrando le attività svolte all'interno
@@ -57,7 +57,7 @@ const MainPage = () => {
</Typography> </Typography>
</ProjectSpotlight> </ProjectSpotlight>
{/* 3. Scuola d'arme */} {/* 3. Scuola d'arme */}
<ProjectSpotlight ref={refTraining} anchor="bottom" image="images/battle.png" mobileImage="images/battle.png" title="Vita militare"> <ProjectSpotlight ref={refTraining} anchor="bottom" image="images/battle.png" mobileImage="images/battle.png" title="Vita Militare">
<Typography pt={1}> <Typography pt={1}>
La dimensione militare è il cuore operativo della Compagnia, che è in grado di allestire un campo d'arme del Basso Medioevo con tende La dimensione militare è il cuore operativo della Compagnia, che è in grado di allestire un campo d'arme del Basso Medioevo con tende
storiche finemente arredate, armamenti e dotazioni coerenti con il periodo rievocato. All'interno del campo vengono mostrate le gerarchie, storiche finemente arredate, armamenti e dotazioni coerenti con il periodo rievocato. All'interno del campo vengono mostrate le gerarchie,
@@ -1,28 +1,15 @@
import { screen } from '@testing-library/react' import { screen } from '@testing-library/react'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { useAnalytics } from 'use-analytics'
import { renderWithRouter as render } from 'components/utils/tests/index.js' import { renderWithRouter as render } from 'components/utils/tests/index.js'
import ProjectsPage from '.' import ProjectsPage from '.'
// Mock the analytics module
vi.mock('use-analytics', () => ({
useAnalytics: () => ({ plugins: { enable: vi.fn(), disable: vi.fn() } }),
}))
vi.stubGlobal('open', vi.fn()) vi.stubGlobal('open', vi.fn())
describe('ProjectsPage component', () => { describe('PeoplePage component', () => {
test('renders without crashing and displays the correct project titles', () => { test('renders without crashing and displays the correct project titles', () => {
render(<ProjectsPage />) render(<ProjectsPage />)
// check the section titles // check the section titles
expect(screen.getByText('Robotics')).toBeInTheDocument() expect(screen.getByText('Ferantino di Zampalocha')).toBeInTheDocument()
expect(screen.getByText('Engineering')).toBeInTheDocument() expect(screen.getByText('Galacino Galaci')).toBeInTheDocument()
expect(screen.getByText('Hobbies')).toBeInTheDocument()
// check some of the projects
expect(screen.getByText('LINFA: An Intuitive Block-Programming Interface for Reconfigurable Robots')).toBeInTheDocument()
expect(screen.getByText("Revamping HHCM's Modular: Swift Generation and Control of Modular Robot Models")).toBeInTheDocument()
expect(screen.getByText("Scuola d'arme")).toBeInTheDocument()
}) })
}) })
@@ -1,24 +1,14 @@
import React from 'react'
import { screen } from '@testing-library/react' import { screen } from '@testing-library/react'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { useAnalytics } from 'use-analytics'
import { renderWithRouter as render } from 'components/utils/tests/index.js' import { renderWithRouter as render } from 'components/utils/tests/index.js'
import PrivacyPage from './index.js' import PrivacyPage from './index.js'
// Mock the analytics module
vi.mock('use-analytics', () => ({
useAnalytics: () => ({ plugins: { enable: vi.fn(), disable: vi.fn() } }),
}))
describe('PrivacyPage', () => { describe('PrivacyPage', () => {
it('renders the Privacy Policy page', () => { it('renders the Privacy Policy page', () => {
render(<PrivacyPage />) render(<PrivacyPage />)
expect(screen.getAllByText('Privacy Policy')).toHaveLength(3) // title, body (cookie preferences section) and footer expect(screen.getAllByText('Privacy Policy')).toHaveLength(2) // title and footer
expect(screen.getByText('Google Analytics')).toBeInTheDocument() expect(screen.getAllByText('Cookie Policy')).toHaveLength(1) // body
expect(screen.getByText('Your Rights')).toBeInTheDocument() expect(screen.getAllByText('Cookie Preferences')).toHaveLength(1) // footer
expect(screen.getByText('Contact Us')).toBeInTheDocument()
expect(screen.getAllByText('Cookie Preferences')).toHaveLength(2) // body and footer
}) })
}) })
+1 -8
View File
@@ -1,14 +1,7 @@
import { screen } from '@testing-library/react' import { screen } from '@testing-library/react'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { useAnalytics } from 'use-analytics'
import { renderWithRouter as render } from 'components/utils/tests/index.js' import { renderWithRouter as render } from 'components/utils/tests/index.js'
import Page from '.' import Page from './index.js'
// Mock the analytics module
vi.mock('use-analytics', () => ({
useAnalytics: () => ({ plugins: { enable: vi.fn(), disable: vi.fn() } }),
}))
describe('Page component', () => { describe('Page component', () => {
const defaultProps = { const defaultProps = {