Files
tatlock-ui/test/core/auth/permission_gate_test.dart
T
Jeroen SchweitzerandClaude Opus 4.5 a991f5ebed test(auth): add unit tests for auth system
- Add permissions_test.dart (51 tests for Domain, Action, Role)
- Add auth_state_test.dart (16 tests for AuthState)
- Add user_preferences_test.dart (12 tests for UserPreferences)
- Add permission_gate_test.dart (10 tests for permission logic)

All 60 tests passing.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 22:15:50 +01:00

173 lines
5.1 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:tatlock_ui/core/auth/auth_state.dart';
import 'package:tatlock_ui/core/auth/permissions.dart';
// Note: PermissionGate widget tests require complex provider mocking.
// These unit tests verify the permission logic that PermissionGate relies on.
// Widget integration tests should be done with a running app or container testing.
void main() {
group('PermissionGate logic', () {
test('hasPermission returns true when role grants permission', () {
final state = AuthState(
isAuthenticated: true,
roles: const [
Role(
id: '1',
name: 'control-room.general:admin',
domain: Domain.controlRoom,
category: 'general',
action: Action.admin,
),
],
);
expect(state.hasPermission(Domain.controlRoom, Action.admin), isTrue);
expect(state.hasPermission(Domain.controlRoom, Action.viewer), isTrue);
});
test('hasPermission returns false when role does not grant permission', () {
final state = AuthState(
isAuthenticated: true,
roles: const [
Role(
id: '1',
name: 'media.general:viewer',
domain: Domain.media,
category: 'general',
action: Action.viewer,
),
],
);
expect(state.hasPermission(Domain.controlRoom, Action.admin), isFalse);
expect(state.hasPermission(Domain.media, Action.admin), isFalse);
});
test('hasPermission returns false when not authenticated', () {
const state = AuthState(isAuthenticated: false);
expect(state.hasPermission(Domain.controlRoom, Action.viewer), isFalse);
});
test('hasPermission respects category', () {
final state = AuthState(
isAuthenticated: true,
roles: const [
Role(
id: '1',
name: 'control-room.servers:admin',
domain: Domain.controlRoom,
category: 'servers',
action: Action.admin,
),
],
);
expect(
state.hasPermission(Domain.controlRoom, Action.admin, category: 'servers'),
isTrue,
);
expect(
state.hasPermission(Domain.controlRoom, Action.admin, category: 'general'),
isFalse,
);
});
test('isGlobalAdmin returns true for admin.general:admin role', () {
final state = AuthState(
isAuthenticated: true,
roles: const [
Role(
id: '1',
name: 'admin.general:admin',
domain: Domain.admin,
category: 'general',
action: Action.admin,
),
],
);
expect(state.isGlobalAdmin, isTrue);
});
test('isGlobalAdmin returns false for non-admin roles', () {
final state = AuthState(
isAuthenticated: true,
roles: const [
Role(
id: '1',
name: 'control-room.general:admin',
domain: Domain.controlRoom,
category: 'general',
action: Action.admin,
),
],
);
expect(state.isGlobalAdmin, isFalse);
});
test('global admin has access to all domains', () {
final state = AuthState(
isAuthenticated: true,
roles: const [
Role(
id: '1',
name: 'admin.general:admin',
domain: Domain.admin,
category: 'general',
action: Action.admin,
),
],
);
// Global admin should have access to everything
expect(state.hasPermission(Domain.controlRoom, Action.admin), isTrue);
expect(state.hasPermission(Domain.media, Action.editor), isTrue);
expect(state.hasPermission(Domain.library, Action.viewer), isTrue);
expect(
state.hasPermission(Domain.documents, Action.user, category: 'custom'),
isTrue,
);
});
test('empty roles list denies all permissions', () {
const state = AuthState(isAuthenticated: true, roles: []);
expect(state.hasPermission(Domain.controlRoom, Action.viewer), isFalse);
expect(state.isGlobalAdmin, isFalse);
});
test('multiple roles are evaluated correctly', () {
final state = AuthState(
isAuthenticated: true,
roles: const [
Role(
id: '1',
name: 'media.general:viewer',
domain: Domain.media,
category: 'general',
action: Action.viewer,
),
Role(
id: '2',
name: 'control-room.general:admin',
domain: Domain.controlRoom,
category: 'general',
action: Action.admin,
),
],
);
// Should have permissions from both roles
expect(state.hasPermission(Domain.media, Action.viewer), isTrue);
expect(state.hasPermission(Domain.controlRoom, Action.admin), isTrue);
// But not permissions not granted by any role
expect(state.hasPermission(Domain.media, Action.admin), isFalse);
expect(state.hasPermission(Domain.library, Action.viewer), isFalse);
});
});
}