1import { render, screen, fireEvent } from '@testing-library/react';
2import { describe, it, expect, vi } from 'vitest';
3import { SupportUs } from "@marzneshin/features/support-us";
4import { useSupportUs as originalUseSupportUs } from './use-support-us';
5import '@testing-library/jest-dom';
6
7vi.mock('./use-support-us', () => ({
8 useSupportUs: vi.fn(),
9}));
10
11const useSupportUs = originalUseSupportUs as unknown as ReturnType<typeof vi.fn>;
12
13describe('SupportUs Component', () => {
14 it('renders the SupportUs component when localStorage is true', () => {
15 useSupportUs.mockReturnValue([true, vi.fn()]);
16
17 render(<SupportUs variant="local-storage" />);
18
19 expect(screen.getByText(/support-us.title/i)).toBeInTheDocument();
20 expect(screen.getByText(/support-us.desc/i)).toBeInTheDocument();
21 expect(screen.getByRole('button', { name: /Close/i })).toBeInTheDocument();
22 });
23
24 it('does not render the SupportUs component when localStorage is false', () => {
25 useSupportUs.mockReturnValue([false, vi.fn()]);
26
27 render(<SupportUs variant="status" />);
28
29 expect(screen.queryByText(/support-us.title/i)).not.toBeInTheDocument();
30 });
31
32 it('closes the SupportUs card when the close button is clicked in local-storage mode', () => {
33 const setSupportUsOpen = vi.fn();
34 useSupportUs.mockReturnValue([true, setSupportUsOpen]);
35
36 render(<SupportUs variant="local-storage" />);
37
38 const closeButton = screen.getByRole('button', { name: /Close/i });
39 fireEvent.mouseDown(closeButton);
40
41 expect(setSupportUsOpen).toHaveBeenCalledWith(false);
42 });
43
44 it('renders the SupportUs component in view mode without close button', () => {
45 render(<SupportUs variant="view" />);
46
47 expect(screen.getByText(/support-us.title/i)).toBeInTheDocument();
48 expect(screen.queryByRole('button', { name: /Close/i })).not.toBeInTheDocument();
49 });
50
51 it('redirects to the donation link when the donation button is clicked', () => {
52 useSupportUs.mockReturnValue([true, vi.fn()]);
53
54 render(<SupportUs variant="local-storage" />);
55
56 const donationLink = screen.getByRole('link', { name: /support-us.donate/i });
57 expect(donationLink).toHaveAttribute('href', 'https://github.com/khodedawsh/marzneshin#donation');
58 });
59});