diff --git a/src/components/common/__tests__/CopyField.test.tsx b/src/components/common/__tests__/CopyField.test.tsx
new file mode 100644
index 0000000..9014513
--- /dev/null
+++ b/src/components/common/__tests__/CopyField.test.tsx
@@ -0,0 +1,58 @@
+import { render, screen } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
+import { describe, it, expect, vi, beforeEach } from 'vitest';
+
+import CopyField from '@/components/common/CopyField';
+
+vi.mock('@/utils/toast.util', () => ({
+ default: { success: vi.fn() },
+}));
+
+const FULL_ADDRESS = 'GBUKOFF6RS5OTIHMGMH4MOVKPAS4JJIZGYXS4DOVZDNBH5YXKJXFNEC';
+
+function setupClipboard() {
+ const writeText = vi.fn().mockResolvedValue(undefined);
+ Object.defineProperty(navigator, 'clipboard', {
+ value: { writeText },
+ configurable: true,
+ writable: true,
+ });
+ return { writeText };
+}
+
+describe('CopyField clipboard integration', () => {
+ beforeEach(() => {
+ setupClipboard();
+ });
+
+ it('copies the full unmasked address to clipboard on button click', async () => {
+ const { writeText } = setupClipboard();
+ const user = userEvent.setup();
+
+ render();
+
+ const copyBtn = screen.getByRole('button', { name: /copy wallet address/i });
+ await user.click(copyBtn);
+
+ expect(writeText).toHaveBeenCalledOnce();
+ expect(writeText).toHaveBeenCalledWith(FULL_ADDRESS);
+ });
+
+ it('displays the full address in the input field', () => {
+ render();
+
+ const input = screen.getByRole('textbox', { name: /wallet address/i });
+ expect(input).toHaveValue(FULL_ADDRESS);
+ });
+
+ it('shows copied state after clicking copy', async () => {
+ setupClipboard();
+ const user = userEvent.setup();
+
+ render();
+
+ await user.click(screen.getByRole('button', { name: /copy wallet address/i }));
+
+ expect(screen.getByRole('button', { name: /wallet address copied/i })).toBeInTheDocument();
+ });
+});
diff --git a/src/utils/__tests__/preferences.sortOrder.test.ts b/src/utils/__tests__/preferences.sortOrder.test.ts
new file mode 100644
index 0000000..c6334c6
--- /dev/null
+++ b/src/utils/__tests__/preferences.sortOrder.test.ts
@@ -0,0 +1,43 @@
+import { describe, it, expect, beforeEach } from 'vitest';
+import { getPreference, setPreference } from '../preferences.utils';
+
+const SORT_KEY = 'creator-list-sort-order';
+const DEFAULT_SORT = 'asc';
+
+describe('sort order persistence via preferences.utils', () => {
+ beforeEach(() => {
+ window.localStorage.clear();
+ });
+
+ it('persists the selected sort order across simulated remounts', () => {
+ setPreference(SORT_KEY, 'desc');
+
+ // Simulate component unmount/remount: re-read from storage with no in-memory state
+ const restored = getPreference(SORT_KEY, DEFAULT_SORT);
+ expect(restored).toBe('desc');
+ });
+
+ it('returns the default sort order when storage is cleared', () => {
+ setPreference(SORT_KEY, 'desc');
+ window.localStorage.clear();
+
+ const restored = getPreference(SORT_KEY, DEFAULT_SORT);
+ expect(restored).toBe(DEFAULT_SORT);
+ });
+
+ it('persists across multiple sort order changes', () => {
+ const orders = ['desc', 'asc', 'desc'] as const;
+ for (const order of orders) {
+ setPreference(SORT_KEY, order);
+ expect(getPreference(SORT_KEY, DEFAULT_SORT)).toBe(order);
+ }
+ });
+
+ it('isolates sort order per key — changing one key does not affect another', () => {
+ setPreference('sort-a', 'desc');
+ setPreference('sort-b', 'asc');
+
+ expect(getPreference('sort-a', DEFAULT_SORT)).toBe('desc');
+ expect(getPreference('sort-b', DEFAULT_SORT)).toBe('asc');
+ });
+});