Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
303 changes: 303 additions & 0 deletions test/network_service_impl_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,303 @@
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:registration_client/platform_android/network_service_impl.dart';

void main() {
TestWidgetsFlutterBinding.ensureInitialized();

late NetworkServiceImpl networkService;

const StandardMessageCodec codec = StandardMessageCodec();

const List<String> saveVersionChannels = <String>[
'dev.flutter.pigeon.registration_client.CommonDetailsApi.saveVersionToGlobalParam',
'dev.flutter.pigeon.registration_client.pigeon.CommonDetailsApi.saveVersionToGlobalParam',
];

const List<String> getVersionChannels = <String>[
'dev.flutter.pigeon.registration_client.CommonDetailsApi.getVersionFromGlobalParam',
'dev.flutter.pigeon.registration_client.pigeon.CommonDetailsApi.getVersionFromGlobalParam',
];

void mockStringResponse(List<String> channels, String value) {
for (final channel in channels) {
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
.setMockMessageHandler(channel, (ByteData? message) async {
return codec.encodeMessage(<Object?>[value]);
});
}
}

void mockPlatformError(List<String> channels) {
for (final channel in channels) {
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
.setMockMessageHandler(channel, (ByteData? message) async {
return codec.encodeMessage(<Object?>[
'error',
'Mock platform error',
null,
]);
});
}
}

void clearMockHandlers() {
for (final channel in <String>[
...saveVersionChannels,
...getVersionChannels,
]) {
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
.setMockMessageHandler(channel, null);
}
}

setUp(() {
networkService = NetworkServiceImpl();

mockStringResponse(saveVersionChannels, 'saved_successfully');
mockStringResponse(getVersionChannels, '1.0.0');
});

tearDown(() {
clearMockHandlers();
});

group('Factory Tests', () {
test('getNetworkServiceImpl returns NetworkServiceImpl instance', () {
final service = getNetworkServiceImpl();

expect(service, isA<NetworkServiceImpl>());
});

test('factory creates separate instances', () {
final first = getNetworkServiceImpl();
final second = getNetworkServiceImpl();

expect(first, isNot(same(second)));
});
});

group('Service Initialization Tests', () {
test('NetworkServiceImpl initializes correctly', () {
expect(networkService, isNotNull);
});

test('multiple instances remain independent', () {
final first = NetworkServiceImpl();
final second = NetworkServiceImpl();

expect(first, isNot(same(second)));
});
});

group('checkInternetConnection Tests', () {
test('checkInternetConnection method exists', () {
expect(networkService.checkInternetConnection, isA<Function>());
});
});

group('getVersionNoApp Tests', () {
test('getVersionNoApp method exists', () {
expect(networkService.getVersionNoApp, isA<Function>());
});
});

group('saveVersionToGlobalParam Tests', () {
test('saveVersionToGlobalParam returns success response', () async {
final response = await networkService.saveVersionToGlobalParam(
'version_id',
'1.0.0',
);

expect(response, 'saved_successfully');
});

test('saveVersionToGlobalParam handles empty values', () async {
final response = await networkService.saveVersionToGlobalParam('', '');

expect(response, 'saved_successfully');
});

test('saveVersionToGlobalParam handles long strings', () async {
final longString = 'a' * 500;

final response = await networkService.saveVersionToGlobalParam(
longString,
longString,
);

expect(response, 'saved_successfully');
});
});

group('getVersionFromGobalParam Tests', () {
test('getVersionFromGobalParam returns version successfully', () async {
final response = await networkService.getVersionFromGobalParam(
'version_id',
);

expect(response, '1.0.0');
});

test('getVersionFromGobalParam handles empty id', () async {
final response = await networkService.getVersionFromGobalParam('');

expect(response, '1.0.0');
});

test('getVersionFromGobalParam handles special characters', () async {
final response = await networkService.getVersionFromGobalParam(
r'!@#$%^&*()',
);

expect(response, '1.0.0');
});
});

group('saveScreenHeaderToGlobalParam Tests', () {
test('saveScreenHeaderToGlobalParam returns success response', () async {
final response = await networkService.saveScreenHeaderToGlobalParam(
'header_id',
'Registration Client',
);

expect(response, 'saved_successfully');
});

test('saveScreenHeaderToGlobalParam handles empty values', () async {
final response = await networkService.saveScreenHeaderToGlobalParam(
'',
'',
);

expect(response, 'saved_successfully');
});

test('saveScreenHeaderToGlobalParam handles unicode values', () async {
final response = await networkService.saveScreenHeaderToGlobalParam(
'header',
'测试-प्रशांत-اختبار',
);

expect(response, 'saved_successfully');
});
});

group('Platform Exception Handling Tests', () {
test('saveVersionToGlobalParam returns empty string on platform error',
() async {
mockPlatformError(saveVersionChannels);

final response = await networkService.saveVersionToGlobalParam(
'id',
'1.0.0',
);

expect(response, '');
});

test('getVersionFromGobalParam returns empty string on platform error',
() async {
mockPlatformError(getVersionChannels);

final response = await networkService.getVersionFromGobalParam('id');

expect(response, '');
});

test('saveScreenHeaderToGlobalParam returns empty string on platform error',
() async {
mockPlatformError(saveVersionChannels);

final response = await networkService.saveScreenHeaderToGlobalParam(
'header',
'value',
);

expect(response, '');
});
Comment on lines +208 to +218
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Mocked error channel is likely wrong for saveScreenHeaderToGlobalParam.

Line 210 injects platform errors into saveVersionChannels, not the screen-header method channel. This can make the test pass without exercising the intended error path.

Suggested fix
+  const List<String> saveScreenHeaderChannels = <String>[
+    'dev.flutter.pigeon.registration_client.CommonDetailsApi.saveScreenHeaderToGlobalParam',
+    'dev.flutter.pigeon.registration_client.pigeon.CommonDetailsApi.saveScreenHeaderToGlobalParam',
+  ];
+
   void clearMockHandlers() {
     for (final channel in <String>[
       ...saveVersionChannels,
       ...getVersionChannels,
+      ...saveScreenHeaderChannels,
     ]) {
       TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
           .setMockMessageHandler(channel, null);
     }
   }

   setUp(() {
     networkService = NetworkServiceImpl();

     mockStringResponse(saveVersionChannels, 'saved_successfully');
     mockStringResponse(getVersionChannels, '1.0.0');
+    mockStringResponse(saveScreenHeaderChannels, 'saved_successfully');
   });

   test('saveScreenHeaderToGlobalParam returns empty string on platform error',
       () async {
-    mockPlatformError(saveVersionChannels);
+    mockPlatformError(saveScreenHeaderChannels);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
test('saveScreenHeaderToGlobalParam returns empty string on platform error',
() async {
mockPlatformError(saveVersionChannels);
final response = await networkService.saveScreenHeaderToGlobalParam(
'header',
'value',
);
expect(response, '');
});
const List<String> saveScreenHeaderChannels = <String>[
'dev.flutter.pigeon.registration_client.CommonDetailsApi.saveScreenHeaderToGlobalParam',
'dev.flutter.pigeon.registration_client.pigeon.CommonDetailsApi.saveScreenHeaderToGlobalParam',
];
void clearMockHandlers() {
for (final channel in <String>[
...saveVersionChannels,
...getVersionChannels,
...saveScreenHeaderChannels,
]) {
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
.setMockMessageHandler(channel, null);
}
}
setUp(() {
networkService = NetworkServiceImpl();
mockStringResponse(saveVersionChannels, 'saved_successfully');
mockStringResponse(getVersionChannels, '1.0.0');
mockStringResponse(saveScreenHeaderChannels, 'saved_successfully');
});
test('saveScreenHeaderToGlobalParam returns empty string on platform error',
() async {
mockPlatformError(saveScreenHeaderChannels);
final response = await networkService.saveScreenHeaderToGlobalParam(
'header',
'value',
);
expect(response, '');
});
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/network_service_impl_test.dart` around lines 208 - 218, The test is
injecting platform errors into the wrong channel
(mockPlatformError(saveVersionChannels)) so the saveScreenHeaderToGlobalParam
error path isn't exercised; update the test to call mockPlatformError with the
screen-header method channel (e.g., saveScreenHeaderChannels or the exact
channel constant used by networkService.saveScreenHeaderToGlobalParam) instead
of saveVersionChannels so the platform exception is routed to
networkService.saveScreenHeaderToGlobalParam during the test.

});

group('Edge Case Tests', () {
test('service handles repeated save calls correctly', () async {
for (int i = 0; i < 5; i++) {
final response = await networkService.saveVersionToGlobalParam(
'id_$i',
'version_$i',
);

expect(response, 'saved_successfully');
}
});

test('service handles special characters correctly', () async {
final response = await networkService.saveScreenHeaderToGlobalParam(
r'!@#$%',
'Header_测试_प्रशांत',
);

expect(response, 'saved_successfully');
});

test('service handles numeric strings correctly', () async {
final response = await networkService.saveVersionToGlobalParam(
'123',
'456',
);

expect(response, 'saved_successfully');
});
});


group('checkInternetConnection Logic Tests', () {
test('method returns Future<String> type', () {
expect(
networkService.checkInternetConnection(),
isA<Future<String>>(),
);
});
});

group('getVersionNoApp Logic Tests', () {
test('method returns Future<String> type', () {
expect(
networkService.getVersionNoApp(),
isA<Future<String>>(),
);
});
});

group('Stability Tests', () {
test('service instance remains stable across calls', () async {
final first = await networkService.saveVersionToGlobalParam(
'id',
'1.0.0',
);

final second = await networkService.getVersionFromGobalParam('id');

expect(first, 'saved_successfully');
expect(second, '1.0.0');
});

test('multiple sequential async calls work correctly', () async {
final responses = <String>[];

for (int i = 0; i < 3; i++) {
final response = await networkService.saveVersionToGlobalParam(
'id_$i',
'version_$i',
);

responses.add(response);
}

expect(responses.length, 3);
expect(
responses.every((element) => element == 'saved_successfully'),
true,
);
});
});
}
Loading