@rsweeten/dropbox-sync
Version:
Reusable Dropbox synchronization module with framework adapters
146 lines (145 loc) • 5.71 kB
JavaScript
import { useNuxtDropboxSync, getCredentialsFromCookies, createNuxtApiHandlers, } from '../nuxt';
import { createDropboxSyncClient } from '../../core/client';
// Mock dependencies
jest.mock('../../core/client');
// Manual mocks for Nuxt modules
jest.mock('nuxt/app', () => ({
useRuntimeConfig: jest.fn().mockReturnValue({
public: {
dropboxAppKey: 'test-app-key',
appUrl: 'https://example.com',
},
dropboxAppSecret: 'test-app-secret',
dropboxRedirectUri: 'https://example.com/api/dropbox/auth/callback',
}),
useCookie: jest.fn().mockImplementation((name) => {
if (name === 'dropbox_access_token') {
return { value: 'test-access-token' };
}
if (name === 'dropbox_refresh_token') {
return { value: 'test-refresh-token' };
}
return { value: null };
}),
}));
// Mock H3 utilities
const mockGetCookie = jest.fn();
const mockSetCookie = jest.fn();
const mockDeleteCookie = jest.fn();
const mockGetQuery = jest.fn();
const mockSendRedirect = jest.fn();
jest.mock('h3', () => ({
getCookie: mockGetCookie,
setCookie: mockSetCookie,
deleteCookie: mockDeleteCookie,
getQuery: mockGetQuery,
sendRedirect: mockSendRedirect,
}));
describe('Nuxt.js adapter', () => {
beforeEach(() => {
jest.clearAllMocks();
// Define process.client as a property for client/server detection
if (!('client' in process)) {
Object.defineProperty(process, 'client', {
value: false,
writable: true,
configurable: true,
});
}
else {
;
process.client = false;
}
});
describe('useNuxtDropboxSync', () => {
it('should create a Dropbox sync client with config values', () => {
;
createDropboxSyncClient.mockReturnValue({
mock: 'client',
});
const result = useNuxtDropboxSync();
expect(createDropboxSyncClient).toHaveBeenCalledWith({
clientId: 'test-app-key',
clientSecret: 'test-app-secret',
});
expect(result).toEqual({ mock: 'client' });
});
it('should add cookie values on client-side', () => {
// Set as client-side
;
process.client = true;
createDropboxSyncClient.mockReturnValue({
mock: 'client',
});
const result = useNuxtDropboxSync();
expect(createDropboxSyncClient).toHaveBeenCalledWith(expect.objectContaining({
clientId: 'test-app-key',
clientSecret: 'test-app-secret',
accessToken: 'test-access-token',
refreshToken: 'test-refresh-token',
}));
});
});
describe('getCredentialsFromCookies', () => {
it('should get credentials from H3 event', () => {
const mockEvent = {};
// Set up mock implementation
mockGetCookie.mockImplementation((event, name) => {
if (name === 'dropbox_access_token')
return 'h3-access-token';
if (name === 'dropbox_refresh_token')
return 'h3-refresh-token';
return null;
});
const credentials = getCredentialsFromCookies(mockEvent);
expect(mockGetCookie).toHaveBeenCalledWith(mockEvent, 'dropbox_access_token');
expect(mockGetCookie).toHaveBeenCalledWith(mockEvent, 'dropbox_refresh_token');
expect(credentials).toEqual({
clientId: 'test-app-key',
clientSecret: 'test-app-secret',
accessToken: 'h3-access-token',
refreshToken: 'h3-refresh-token',
});
});
});
describe('createNuxtApiHandlers', () => {
const mockEvent = {};
beforeEach(() => {
// Reset H3 mocks for each test
mockGetCookie.mockReset();
mockSetCookie.mockReset();
mockDeleteCookie.mockReset();
mockGetQuery.mockReset();
mockSendRedirect.mockReset();
});
it('should create Nuxt API handlers with necessary methods', () => {
const handlers = createNuxtApiHandlers();
expect(handlers).toHaveProperty('status');
expect(handlers).toHaveProperty('oauthStart');
expect(handlers).toHaveProperty('oauthCallback');
expect(handlers).toHaveProperty('logout');
});
it('should check connection status', async () => {
mockGetCookie.mockReturnValue('h3-access-token');
const handlers = createNuxtApiHandlers();
const result = await handlers.status(mockEvent);
expect(mockGetCookie).toHaveBeenCalledWith(mockEvent, 'dropbox_access_token');
expect(result).toEqual({ connected: true });
});
it('should handle OAuth start', async () => {
;
createDropboxSyncClient.mockReturnValue({
auth: {
getAuthUrl: jest
.fn()
.mockResolvedValue('https://dropbox.com/oauth'),
},
});
mockSendRedirect.mockImplementation(() => ({ redirected: true }));
const handlers = createNuxtApiHandlers();
await handlers.oauthStart(mockEvent);
expect(createDropboxSyncClient).toHaveBeenCalled();
expect(mockSendRedirect).toHaveBeenCalledWith(mockEvent, 'https://dropbox.com/oauth');
});
});
});