import 'dart:convert';
import 'package:consumer_app/core/networking/api_client.dart';
import 'package:consumer_app/models/image_suggestion_models.dart';
import 'package:consumer_app/repositories/http_image_suggestion_repository.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:http/http.dart' as http;
import 'package:http/testing.dart';
void main() {
test(
'submits a scoped multipart suggestion with rights and idempotency',
() async {
http.Request? submittedRequest;
final api = ApiClient(
baseUrl: Uri.parse('https://example.test/wp-json/meinweimar/v1'),
locale: () => 'de-DE',
client: MockClient((request) async {
submittedRequest = request;
return http.Response(
'{"suggestion":{"id":9,"target_type":"services","target_id":12,"status":"submitted","original_filename":"service.jpg"}}',
201,
);
}),
);
final response = await HttpImageSuggestionRepository(api).submit(
targetType: 'services',
targetId: 12,
bytes: <int>[1, 2, 3],
filename: 'service.jpg',
rightsHolderConfirmed: true,
lawfulSourceConfirmed: true,
personsConsentConfirmed: true,
platformLicenseConfirmed: true,
idempotencyKey: 'upload-test-1234',
source: 'https://example.test/source',
license: 'CC BY 4.0',
photographer: 'Test Photographer',
description: 'Service entrance',
);
expect(
submittedRequest?.url.path,
'/wp-json/meinweimar/v1/image-suggestions',
);
expect(submittedRequest?.headers['idempotency-key'], 'upload-test-1234');
final body = utf8.decode(submittedRequest!.bodyBytes);
expect(body, contains('name="target_type"'));
expect(body, contains('services'));
expect(body, contains('name="target_id"'));
expect(body, contains('12'));
expect(body, contains('name="rights_holder_confirmed"'));
expect(body, contains('name="lawful_source_confirmed"'));
expect(body, contains('name="persons_consent_confirmed"'));
expect(body, contains('name="platform_license_confirmed"'));
expect(body, contains('name="license"'));
expect(body, contains('CC BY 4.0'));
expect(body, contains('filename="service.jpg"'));
expect(response.status, 'submitted');
},
);
test(
'reads own image suggestion status through the authenticated route',
() async {
Uri? requestedUri;
final api = ApiClient(
baseUrl: Uri.parse('https://example.test/wp-json/meinweimar/v1'),
locale: () => 'de-DE',
client: MockClient((request) async {
requestedUri = request.url;
return http.Response(
'{"suggestions":[{"id":4,"target_type":"places","target_id":7,"status":"in_review","original_filename":"place.jpg","checks":{"malware_status":"pending"}}]}',
200,
);
}),
);
final response = await HttpImageSuggestionRepository(
api,
).own(status: 'in_review');
expect(requestedUri?.path, '/wp-json/meinweimar/v1/image-suggestions');
expect(requestedUri?.queryParameters['status'], 'in_review');
expect(response, isA<ImageSuggestionList>());
expect(response.items.single.status, 'in_review');
},
);
test(
'posts a submitter response with idempotency and maps the result',
() async {
Uri? requestedUri;
String? idempotencyKey;
String? requestBody;
final api = ApiClient(
baseUrl: Uri.parse('https://example.test/wp-json/meinweimar/v1'),
locale: () => 'de-DE',
client: MockClient((request) async {
requestedUri = request.url;
idempotencyKey = request.headers['idempotency-key'];
requestBody = request.body;
return http.Response(
'{"suggestion":{"id":4,"target_type":"places","target_id":7,"status":"submitted","request_message":"","submitter_response":"Neue Angaben"}}',
200,
);
}),
);
final response = await HttpImageSuggestionRepository(api).respond(
suggestionId: 4,
response: 'Neue Angaben',
idempotencyKey: 'response-test-1234',
);
expect(requestedUri?.path, '/wp-json/meinweimar/v1/image-suggestions/4');
expect(idempotencyKey, 'response-test-1234');
expect(requestBody, '{"response":"Neue Angaben"}');
expect(response.status, 'submitted');
expect(response.submitterResponse, 'Neue Angaben');
},
);
}
