amoriai/test/widget_test.dart

191 lines
5.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:muning_menu_recommender/main.dart';
void main() {
group('Muning Menu Recommender App Tests', () {
testWidgets('App should start without crashing', (
WidgetTester tester,
) async {
// Build our app and trigger a frame.
await tester.pumpWidget(
const ProviderScope(child: AmoriMenuRecommenderApp()),
);
// Verify that the app starts
expect(find.byType(MaterialApp), findsOneWidget);
});
testWidgets('Splash screen should be displayed initially', (
WidgetTester tester,
) async {
await tester.pumpWidget(
const ProviderScope(child: AmoriMenuRecommenderApp()),
);
// Should show splash screen initially
expect(find.text('Muning Menu Recommender'), findsOneWidget);
});
});
group('Black Box Testing - Equivalence Class Partitioning', () {
test('Valid email format should pass validation', () {
final validEmails = [
'user@example.com',
'test.email@domain.co.id',
'user123@gmail.com',
];
for (final email in validEmails) {
expect(
_isValidEmail(email),
true,
reason: 'Email $email should be valid',
);
}
});
test('Invalid email format should fail validation', () {
final invalidEmails = [
'invalid-email',
'@domain.com',
'user@',
'user.domain.com',
'',
];
for (final email in invalidEmails) {
expect(
_isValidEmail(email),
false,
reason: 'Email $email should be invalid',
);
}
});
test('Valid password should pass validation', () {
final validPasswords = ['password123', 'myPassword1', 'securePass2024'];
for (final password in validPasswords) {
expect(
_isValidPassword(password),
true,
reason: 'Password should be valid',
);
}
});
test('Invalid password should fail validation', () {
final invalidPasswords = [
'123', // Too short
'pass', // Too short
'', // Empty
'password', // No numbers
'12345678', // No letters
];
for (final password in invalidPasswords) {
expect(
_isValidPassword(password),
false,
reason: 'Password should be invalid',
);
}
});
});
group('Black Box Testing - Boundary Value Analysis', () {
test('Budget range boundary values', () {
// Test minimum boundary
expect(_isValidBudget(10000), true);
expect(_isValidBudget(9999), false);
// Test maximum boundary
expect(_isValidBudget(200000), true);
expect(_isValidBudget(200001), false);
// Test middle values
expect(_isValidBudget(50000), true);
expect(_isValidBudget(100000), true);
});
test('OCR confidence threshold boundary values', () {
// Test minimum acceptable confidence
expect(_isAcceptableOCRConfidence(0.6), true);
expect(_isAcceptableOCRConfidence(0.59), false);
// Test maximum confidence
expect(_isAcceptableOCRConfidence(1.0), true);
expect(_isAcceptableOCRConfidence(1.01), false);
});
});
group('Black Box Testing - Decision Table', () {
test('User authentication decision table', () {
// Test case 1: Valid email, valid password, terms accepted
expect(_canUserRegister(true, true, true), true);
// Test case 2: Valid email, valid password, terms not accepted
expect(_canUserRegister(true, true, false), false);
// Test case 3: Valid email, invalid password, terms accepted
expect(_canUserRegister(true, false, true), false);
// Test case 4: Invalid email, valid password, terms accepted
expect(_canUserRegister(false, true, true), false);
// Test case 5: All invalid
expect(_canUserRegister(false, false, false), false);
});
test('Menu recommendation decision table', () {
// Test case 1: Has preferences, menu available, no allergies
expect(_shouldRecommendMenu(true, true, false), true);
// Test case 2: Has preferences, menu available, has allergies
expect(_shouldRecommendMenu(true, true, true), false);
// Test case 3: No preferences, menu available, no allergies
expect(_shouldRecommendMenu(false, true, false), true);
// Test case 4: Has preferences, menu not available, no allergies
expect(_shouldRecommendMenu(true, false, false), false);
});
});
}
// Helper functions for testing
bool _isValidEmail(String email) {
return RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$').hasMatch(email);
}
bool _isValidPassword(String password) {
if (password.length < 6) return false;
if (!RegExp(r'^(?=.*[a-zA-Z])(?=.*\d)').hasMatch(password)) return false;
return true;
}
bool _isValidBudget(int budget) {
return budget >= 10000 && budget <= 200000;
}
bool _isAcceptableOCRConfidence(double confidence) {
return confidence >= 0.6 && confidence <= 1.0;
}
bool _canUserRegister(bool validEmail, bool validPassword, bool termsAccepted) {
return validEmail && validPassword && termsAccepted;
}
bool _shouldRecommendMenu(
bool hasPreferences,
bool menuAvailable,
bool hasAllergies,
) {
if (!menuAvailable) return false;
if (hasAllergies) return false;
return true;
}