File size: 3,125 Bytes
1f5ea39
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { describe, it, expect, vi, beforeEach } from 'vitest';

// The wrapper delegates to legacy helpers; mock them so no real DB is loaded.
const { canAccessTrip } = vi.hoisted(() => ({ canAccessTrip: vi.fn() }));
vi.mock('../../../src/db/database', () => ({ canAccessTrip, closeDb: () => {}, reinitialize: () => {} }));

const { checkPermission } = vi.hoisted(() => ({ checkPermission: vi.fn() }));
vi.mock('../../../src/services/permissions', () => ({ checkPermission }));

const { share } = vi.hoisted(() => ({
  share: {
    createOrUpdateShareLink: vi.fn(),
    getShareLink: vi.fn(),
    deleteShareLink: vi.fn(),
    getSharedTripData: vi.fn(),
    getSharedPlacePhotoPath: vi.fn(),
  },
}));
vi.mock('../../../src/services/shareService', () => share);

import { ShareService } from '../../../src/nest/share/share.service';
import type { User } from '../../../src/types';

function svc() {
  return new ShareService();
}

beforeEach(() => vi.clearAllMocks());

describe('ShareService', () => {
  it('verifyTripAccess delegates to canAccessTrip', () => {
    canAccessTrip.mockReturnValue({ id: 5, user_id: 2 });
    expect(svc().verifyTripAccess('5', 2)).toEqual({ id: 5, user_id: 2 });
    expect(canAccessTrip).toHaveBeenCalledWith('5', 2);
  });

  it('canManage forwards the ownership flag when the user owns the trip', () => {
    checkPermission.mockReturnValue(true);
    const trip = { user_id: 1 } as never;
    const user = { id: 1, role: 'user' } as User;
    expect(svc().canManage(trip, user)).toBe(true);
    expect(checkPermission).toHaveBeenCalledWith('share_manage', 'user', 1, 1, false);
  });

  it('canManage marks the user as a guest when they do not own the trip', () => {
    checkPermission.mockReturnValue(false);
    const trip = { user_id: 2 } as never;
    const user = { id: 1, role: 'user' } as User;
    expect(svc().canManage(trip, user)).toBe(false);
    expect(checkPermission).toHaveBeenCalledWith('share_manage', 'user', 2, 1, true);
  });

  it('createOrUpdate delegates to the legacy share service', () => {
    share.createOrUpdateShareLink.mockReturnValue({ token: 't', created: true });
    const perms = { share_map: true };
    expect(svc().createOrUpdate('5', 2, perms)).toEqual({ token: 't', created: true });
    expect(share.createOrUpdateShareLink).toHaveBeenCalledWith('5', 2, perms);
  });

  it('get / remove / getSharedTripData / getSharedPlacePhotoPath delegate', () => {
    share.getShareLink.mockReturnValue({ token: 't' });
    expect(svc().get('5')).toEqual({ token: 't' });
    expect(share.getShareLink).toHaveBeenCalledWith('5');

    svc().remove('5');
    expect(share.deleteShareLink).toHaveBeenCalledWith('5');

    share.getSharedTripData.mockReturnValue({ trip: { id: 9 } });
    expect(svc().getSharedTripData('tok')).toEqual({ trip: { id: 9 } });
    expect(share.getSharedTripData).toHaveBeenCalledWith('tok');

    share.getSharedPlacePhotoPath.mockReturnValue('/cache/p1.jpg');
    expect(svc().getSharedPlacePhotoPath('tok', 'p1')).toBe('/cache/p1.jpg');
    expect(share.getSharedPlacePhotoPath).toHaveBeenCalledWith('tok', 'p1');
  });
});