diff --git a/src/utils/__tests__/toast.util.test.tsx b/src/utils/__tests__/toast.util.test.tsx
new file mode 100644
index 00000000..39dc1812
--- /dev/null
+++ b/src/utils/__tests__/toast.util.test.tsx
@@ -0,0 +1,95 @@
+import { render, screen, act } from '@testing-library/react';
+import { Toaster } from 'react-hot-toast';
+import toast from 'react-hot-toast';
+import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
+import showToast from '../toast.util';
+
+describe('toast util auto-dismiss and manual close', () => {
+ beforeEach(() => {
+ vi.useFakeTimers();
+ Object.defineProperty(window, 'matchMedia', {
+ writable: true,
+ value: vi.fn().mockImplementation((query: string) => ({
+ matches: false,
+ media: query,
+ onchange: null,
+ addEventListener: vi.fn(),
+ removeEventListener: vi.fn(),
+ addListener: vi.fn(),
+ removeListener: vi.fn(),
+ dispatchEvent: vi.fn(),
+ })),
+ });
+ });
+
+ afterEach(() => {
+ toast.remove();
+ vi.useRealTimers();
+ });
+
+ it('toast visible immediately after render', () => {
+ render();
+
+ act(() => {
+ showToast.success('Success message');
+ });
+
+ expect(screen.getByText('Success message')).toBeInTheDocument();
+ });
+
+ it('toast still visible before auto-dismiss fires', () => {
+ render();
+
+ act(() => {
+ showToast.success('Success message');
+ });
+
+ expect(screen.getByText('Success message')).toBeInTheDocument();
+
+ act(() => {
+ vi.advanceTimersByTime(3999);
+ });
+
+ expect(screen.getByText('Success message')).toBeInTheDocument();
+ });
+
+ it('toast removed after auto-dismiss and remove delay', () => {
+ render();
+
+ act(() => {
+ showToast.success('Success message');
+ });
+
+ expect(screen.getByText('Success message')).toBeInTheDocument();
+
+ act(() => {
+ vi.advanceTimersByTime(4000);
+ });
+
+ act(() => {
+ vi.advanceTimersByTime(1000);
+ });
+
+ expect(screen.queryByText('Success message')).not.toBeInTheDocument();
+ });
+
+ it('manual close removes the toast before the auto-dismiss timer fires', () => {
+ render();
+
+ act(() => {
+ showToast.success('Success message');
+ });
+
+ expect(screen.getByText('Success message')).toBeInTheDocument();
+
+ act(() => {
+ toast.dismiss();
+ });
+
+ act(() => {
+ vi.advanceTimersByTime(1000);
+ });
+
+ expect(screen.queryByText('Success message')).not.toBeInTheDocument();
+ });
+});