File size: 2,115 Bytes
66f3b51
529090e
 
 
 
 
 
 
 
 
 
 
 
66f3b51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
529090e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { describe, beforeAll, afterAll, test, expect, vi } from 'vitest';
import { prisma, checkPrismaConnection } from '../database/prisma.js';
import { initializeDatabase } from '../database/index.js';
import {
  setPlatformDefault,
  setWidgetPermission,
  checkWidgetAccess,
  getWidgetPermissions,
} from '../services/security/securityRepository.js';

let prismaAvailable = false;
const testWidgetId = `widget-${Date.now()}`;

vi.mock('../database/prisma', () => ({
  prisma: {
    $connect: vi.fn(),
    $disconnect: vi.fn(),
    widgetPermission: {
      findUnique: vi.fn(),
      upsert: vi.fn(),
      findMany: vi.fn(),
      deleteMany: vi.fn(),
    },
    $queryRaw: vi.fn()
  },
  checkPrismaConnection: vi.fn().mockResolvedValue(false), // Skip tests in CI
}));

describe('Security permissions (integration)', () => {
  beforeAll(async () => {
    prismaAvailable = await checkPrismaConnection();
    if (prismaAvailable) {
      await initializeDatabase();
      await prisma.widgetPermission.deleteMany({
        where: { widgetId: testWidgetId },
      });
    }
  });

  afterAll(async () => {
    if (prismaAvailable) {
      await prisma.widgetPermission.deleteMany({
        where: { widgetId: testWidgetId },
      });
      await prisma.$disconnect();
    }
  });

  test('respects widget override access levels', async () => {
    if (!prismaAvailable) {
      expect(true).toBe(true);
      return;
    }

    await setPlatformDefault('logs', 'read');
    await setWidgetPermission(testWidgetId, 'logs', 'write', true);

    const hasWrite = await checkWidgetAccess(testWidgetId, 'logs', 'write');
    expect(hasWrite).toBe(true);
  });

  test('falls back to platform default when override absent', async () => {
    if (!prismaAvailable) {
      expect(true).toBe(true);
      return;
    }

    await setPlatformDefault('telemetry', 'read');
    const hasWrite = await checkWidgetAccess(testWidgetId, 'telemetry', 'write');
    expect(hasWrite).toBe(false);

    const permissions = await getWidgetPermissions(testWidgetId);
    expect(Array.isArray(permissions)).toBe(true);
  });
});