mirror of
https://github.com/foss42/apidash.git
synced 2025-12-02 10:49:49 +08:00
275 lines
7.5 KiB
Dart
275 lines
7.5 KiB
Dart
import 'package:apidash/screens/common_widgets/common_widgets.dart';
|
|
import 'package:apidash_core/apidash_core.dart';
|
|
import 'package:extended_text_field/extended_text_field.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_portal/flutter_portal.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
void main() {
|
|
group('BearerAuthFields Widget Tests', () {
|
|
late AuthModel? mockAuthData;
|
|
late Function(AuthModel?) mockUpdateAuth;
|
|
late List<AuthModel?> capturedAuthUpdates;
|
|
|
|
setUp(() {
|
|
capturedAuthUpdates = [];
|
|
mockUpdateAuth = (AuthModel? authModel) {
|
|
capturedAuthUpdates.add(authModel);
|
|
};
|
|
});
|
|
|
|
testWidgets('renders with default values when authData is null',
|
|
(WidgetTester tester) async {
|
|
mockAuthData = null;
|
|
|
|
await tester.pumpWidget(
|
|
Portal(
|
|
child: MaterialApp(
|
|
home: Scaffold(
|
|
body: BearerAuthFields(
|
|
authData: mockAuthData,
|
|
updateAuth: mockUpdateAuth,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
expect(find.byType(EnvAuthField), findsOneWidget);
|
|
expect(find.text('Token'), findsNWidgets(2));
|
|
});
|
|
|
|
testWidgets('renders with existing bearer auth data',
|
|
(WidgetTester tester) async {
|
|
mockAuthData = const AuthModel(
|
|
type: APIAuthType.bearer,
|
|
bearer: AuthBearerModel(
|
|
token: 'test-bearer-token',
|
|
),
|
|
);
|
|
|
|
await tester.pumpWidget(
|
|
Portal(
|
|
child: MaterialApp(
|
|
home: Scaffold(
|
|
body: BearerAuthFields(
|
|
authData: mockAuthData,
|
|
updateAuth: mockUpdateAuth,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
expect(find.byType(EnvAuthField), findsOneWidget);
|
|
expect(find.text('Token'), findsNWidgets(2));
|
|
});
|
|
|
|
testWidgets('updates auth data when token changes',
|
|
(WidgetTester tester) async {
|
|
mockAuthData = const AuthModel(
|
|
type: APIAuthType.bearer,
|
|
bearer: AuthBearerModel(
|
|
token: 'old-token',
|
|
),
|
|
);
|
|
|
|
await tester.pumpWidget(
|
|
Portal(
|
|
child: MaterialApp(
|
|
home: Scaffold(
|
|
body: BearerAuthFields(
|
|
authData: mockAuthData,
|
|
updateAuth: mockUpdateAuth,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
// Find the token field
|
|
final textFields = find.byType(ExtendedTextField);
|
|
expect(textFields, findsAtLeastNWidgets(1));
|
|
|
|
final tokenField = textFields.first;
|
|
await tester.tap(tokenField);
|
|
await tester.pumpAndSettle();
|
|
|
|
// Use tester.testTextInput to enter text directly
|
|
tester.testTextInput.enterText('new-bearer-token');
|
|
await tester.pumpAndSettle();
|
|
|
|
// Verify that updateAuth was called
|
|
expect(capturedAuthUpdates.length, greaterThan(0));
|
|
final lastUpdate = capturedAuthUpdates.last;
|
|
expect(lastUpdate?.bearer?.token, 'new-bearer-token');
|
|
expect(lastUpdate?.type, APIAuthType.bearer);
|
|
});
|
|
|
|
testWidgets('respects readOnly property', (WidgetTester tester) async {
|
|
mockAuthData = const AuthModel(
|
|
type: APIAuthType.bearer,
|
|
bearer: AuthBearerModel(
|
|
token: 'test-token',
|
|
),
|
|
);
|
|
|
|
await tester.pumpWidget(
|
|
Portal(
|
|
child: MaterialApp(
|
|
home: Scaffold(
|
|
body: BearerAuthFields(
|
|
authData: mockAuthData,
|
|
updateAuth: mockUpdateAuth,
|
|
readOnly: true,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
// Verify that EnvAuthField widget is rendered
|
|
expect(find.byType(EnvAuthField), findsOneWidget);
|
|
|
|
// The readOnly property should be passed to EnvAuthField widget
|
|
// This is verified by the widget structure itself
|
|
});
|
|
|
|
testWidgets('displays correct hint text', (WidgetTester tester) async {
|
|
mockAuthData = null;
|
|
|
|
await tester.pumpWidget(
|
|
Portal(
|
|
child: MaterialApp(
|
|
home: Scaffold(
|
|
body: BearerAuthFields(
|
|
authData: mockAuthData,
|
|
updateAuth: mockUpdateAuth,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
expect(find.byType(EnvAuthField), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('handles empty auth data gracefully',
|
|
(WidgetTester tester) async {
|
|
mockAuthData = const AuthModel(
|
|
type: APIAuthType.bearer,
|
|
bearer: AuthBearerModel(
|
|
token: '',
|
|
),
|
|
);
|
|
|
|
await tester.pumpWidget(
|
|
Portal(
|
|
child: MaterialApp(
|
|
home: Scaffold(
|
|
body: BearerAuthFields(
|
|
authData: mockAuthData,
|
|
updateAuth: mockUpdateAuth,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
expect(find.byType(EnvAuthField), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('creates proper AuthModel on token change',
|
|
(WidgetTester tester) async {
|
|
mockAuthData = null;
|
|
|
|
await tester.pumpWidget(
|
|
Portal(
|
|
child: MaterialApp(
|
|
home: Scaffold(
|
|
body: BearerAuthFields(
|
|
authData: mockAuthData,
|
|
updateAuth: mockUpdateAuth,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
// Enter token
|
|
final textFields = find.byType(ExtendedTextField);
|
|
expect(textFields, findsAtLeastNWidgets(1));
|
|
|
|
final tokenField = textFields.first;
|
|
await tester.tap(tokenField);
|
|
await tester.pumpAndSettle();
|
|
|
|
// Use tester.testTextInput to enter text directly
|
|
tester.testTextInput.enterText('test-bearer-token');
|
|
await tester.pumpAndSettle();
|
|
|
|
// Verify that updateAuth was called with correct structure
|
|
expect(capturedAuthUpdates.length, greaterThan(0));
|
|
final lastUpdate = capturedAuthUpdates.last;
|
|
expect(lastUpdate?.type, APIAuthType.bearer);
|
|
expect(lastUpdate?.bearer?.token, 'test-bearer-token');
|
|
});
|
|
|
|
testWidgets('initializes with correct default token value',
|
|
(WidgetTester tester) async {
|
|
mockAuthData = null;
|
|
|
|
await tester.pumpWidget(
|
|
Portal(
|
|
child: MaterialApp(
|
|
home: Scaffold(
|
|
body: BearerAuthFields(
|
|
authData: mockAuthData,
|
|
updateAuth: mockUpdateAuth,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
// The token field should be empty initially
|
|
expect(find.byType(EnvAuthField), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('trims whitespace from token input',
|
|
(WidgetTester tester) async {
|
|
mockAuthData = null;
|
|
|
|
await tester.pumpWidget(
|
|
Portal(
|
|
child: MaterialApp(
|
|
home: Scaffold(
|
|
body: BearerAuthFields(
|
|
authData: mockAuthData,
|
|
updateAuth: mockUpdateAuth,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
// Enter token with whitespace
|
|
final textFields = find.byType(ExtendedTextField);
|
|
expect(textFields, findsAtLeastNWidgets(1));
|
|
|
|
final tokenField = textFields.first;
|
|
await tester.tap(tokenField);
|
|
await tester.pumpAndSettle();
|
|
|
|
// Use tester.testTextInput to enter text directly
|
|
tester.testTextInput.enterText(' test-token ');
|
|
await tester.pumpAndSettle();
|
|
|
|
// Verify that updateAuth was called with trimmed token
|
|
expect(capturedAuthUpdates.length, greaterThan(0));
|
|
final lastUpdate = capturedAuthUpdates.last;
|
|
expect(lastUpdate?.bearer?.token, 'test-token');
|
|
});
|
|
});
|
|
}
|