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/ai/ai_report_assistant.dart';
import 'package:machweis/core/ai/ai_settings_store.dart';
import 'package:machweis/core/storage/local_storage.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
setUpAll(() async {
SharedPreferences.setMockInitialValues({});
await LocalStorage.instance.initialize(forcePreferences: true);
await AiSettingsStore.instance.initialize();
});
for (final provider in AiProvider.values) {
test('${provider.label} wird sicher über den Proxy angefragt', () async {
await AiSettingsStore.instance.save(
AiSettings(
enabled: true,
provider: provider,
proxyUrl: 'https://backend.example.test/',
),
);
final client = MockClient((request) async {
expect(
request.url.toString(),
'https://backend.example.test/ai/report-suggestion',
);
expect(
request.headers.keys.map((key) => key.toLowerCase()),
isNot(contains('authorization')),
);
final body = jsonDecode(request.body) as Map<String, dynamic>;
expect(body['provider'], provider.name);
expect(body['model'], AiSettingsStore.instance.settings.activeModel);
expect(body['input'], contains('Müller GmbH'));
expect(
(body['schema'] as Map<String, dynamic>)['additionalProperties'],
isFalse,
);
return http.Response(
jsonEncode({
'suggestion': {
'activities': ['Verteiler geprüft'],
'materials': [
{'name': 'Kabel', 'quantity': '20', 'unit': 'm'},
],
'additionalOrder': '',
'openQuestions': ['Welche Messwerte wurden erfasst?'],
'confidence': 0.82,
'startTime': '08:00',
'endTime': '10:30',
'breakMinutes': 15,
},
}),
200,
headers: {'content-type': 'application/json; charset=utf-8'},
);
});
final assistant = RemoteAiReportAssistant(client: client);
final suggestion = await assistant.suggest(
const AiReportRequest(
notes: '8 bis halb elf Verteiler geprüft, 20 Meter Kabel',
customer: 'Müller GmbH',
site: 'Werkhalle',
),
);
expect(suggestion.activities, ['Verteiler geprüft']);
expect(suggestion.materials.single.quantity, '20');
expect(suggestion.openQuestions, isNotEmpty);
expect(suggestion.startTime, '08:00');
});
}
test('Ohne Proxy werden keine KI-Daten versendet', () async {
await AiSettingsStore.instance.save(
const AiSettings(enabled: true, provider: AiProvider.openAi),
);
var called = false;
final assistant = RemoteAiReportAssistant(
client: MockClient((_) async {
called = true;
return http.Response('{}', 200);
}),
);
await expectLater(
assistant.suggest(
const AiReportRequest(notes: 'Test', customer: 'Kunde', site: 'Ort'),
),
throwsA(
isA<AiAssistantException>().having(
(error) => error.message,
'message',
contains('Proxy-URL'),
),
),
);
expect(called, isFalse);
});
}
