import 'dart:convert';
import 'package:flutter_test/flutter_test.dart';
import 'package:http/http.dart' as http;
import 'package:http/testing.dart';
import 'package:machweis/core/web/web_office_api.dart';
void main() {
test('Berichtsliste überträgt Suche, Status und Pagination', () async {
late Uri requested;
final api = WebOfficeApi(
baseUrl: 'https://example.invalid',
client: MockClient((request) async {
requested = request.url;
return http.Response(
jsonEncode({
'data': {
'items': [
{'id': 'report-1'},
],
'page': 2,
'limit': 10,
'total': 27,
},
}),
200,
headers: {'content-type': 'application/json'},
);
}),
);
final result = await api.listReports(
search: 'Müller Baustelle',
status: 'draft',
page: 2,
limit: 10,
);
expect(requested.path, '/api/v1/reports');
expect(requested.queryParameters, {
'page': '2',
'limit': '10',
'status': 'draft',
'search': 'Müller Baustelle',
});
expect(result.items.single['id'], 'report-1');
expect(result.page, 2);
expect(result.total, 27);
});
test(
'Firmenprofil wird mandantengebunden gelesen und aktualisiert',
() async {
final requests = <http.Request>[];
final api = WebOfficeApi(
baseUrl: 'https://example.invalid',
client: MockClient((request) async {
requests.add(request);
if (request.method == 'GET') {
return http.Response(
jsonEncode({
'data': {'name': 'Musterbetrieb', 'owner': 'Ada Admin'},
}),
200,
);
}
return http.Response(
jsonEncode({'data': jsonDecode(request.body)}),
200,
);
}),
);
final loaded = await api.companyProfile();
final updated = await api.updateCompanyProfile({
...loaded,
'email': 'office@example.test',
});
expect(requests.map((request) => request.method), ['GET', 'PATCH']);
expect(
requests.every(
(request) => request.url.path == '/api/v1/company-profile',
),
isTrue,
);
expect(updated['name'], 'Musterbetrieb');
expect(updated['email'], 'office@example.test');
},
);
test(
'Rollen und Berechtigungen verwenden die geschützten Endpunkte',
() async {
final requests = <http.Request>[];
final api = WebOfficeApi(
baseUrl: 'https://example.invalid',
client: MockClient((request) async {
requests.add(request);
if (request.method == 'GET') {
return http.Response(
jsonEncode({
'data': {'items': []},
}),
200,
);
}
return http.Response(
jsonEncode({
'data': {
'role': 'technician',
'permission': 'reports.send',
'granted': false,
},
}),
200,
);
}),
);
expect(await api.listPermissions(), isEmpty);
await api.updateEmployeeRole('employee-1', 'technician');
await api.updatePermission(
role: 'office',
permission: 'reports.send',
granted: false,
);
expect(
requests.map((request) => '${request.method} ${request.url.path}'),
[
'GET /api/v1/permissions',
'PATCH /api/v1/employees/employee-1/role',
'PATCH /api/v1/permissions',
],
);
expect(jsonDecode(requests[1].body), {'role': 'technician'});
expect(jsonDecode(requests[2].body), {
'role': 'office',
'permission': 'reports.send',
'granted': false,
});
},
);
}
