From 91a9e4f9a4729922e42e2aa3b1eb8924f61883cd Mon Sep 17 00:00:00 2001 From: athul rd <49590824+athulrd@users.noreply.github.com> Date: Mon, 19 Oct 2026 22:34:56 +0530 Subject: [PATCH] Tests: add flutter_test and money formatting tests The template counter test could never compile (no flutter_test dev dependency, no MyApp). Replace it with unit tests for formatMoney (INR byte-identical to the old formatter, AED, BHD) and currency parsing. Co-Authored-By: Claude Opus 5.5 --- pubspec.lock | 89 +++++++++++++++++++++++++++++++++++++++++++- pubspec.yaml | 2 + test/money_test.dart | 42 +++++++++++++++++++++ 3 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 test/money_test.dart diff --git a/pubspec.lock b/pubspec.lock index 86abcc9..6d3ce2f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -33,6 +33,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.13.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" characters: dependency: transitive description: @@ -61,10 +69,10 @@ packages: dependency: transitive description: name: clock - sha256: e51d50bca3217c9a9fa2b41a30e4a38971133f5f9ec7a3d57bae095007f1d28e + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "1.1.2" collection: dependency: transitive description: @@ -105,6 +113,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.9" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" ffi: dependency: transitive description: @@ -198,6 +214,11 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.35" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" flutter_web_plugins: dependency: transitive description: flutter @@ -363,6 +384,30 @@ packages: url: "https://pub.dev" source: hosted version: "4.12.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" lints: dependency: transitive description: @@ -371,6 +416,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 + url: "https://pub.dev" + source: hosted + version: "0.12.19" material_color_utilities: dependency: transitive description: @@ -528,6 +581,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" string_scanner: dependency: transitive description: @@ -544,6 +613,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" + url: "https://pub.dev" + source: hosted + version: "0.7.11" typed_data: dependency: transitive description: @@ -640,6 +717,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "89b11d62e1040ee681af3b4f1c97a803ecbf010c6e8b9c5896ee5b08c3bf7b78" + url: "https://pub.dev" + source: hosted + version: "15.4.0" web: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 0cd83dd..2c54367 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,6 +20,8 @@ dependencies: cupertino_icons: ^1.0.6 dev_dependencies: + flutter_test: + sdk: flutter flutter_launcher_icons: ^0.14.0 flutter_native_splash: ^2.4.0 flutter_lints: ^4.0.0 diff --git a/test/money_test.dart b/test/money_test.dart new file mode 100644 index 0000000..ef1e3fd --- /dev/null +++ b/test/money_test.dart @@ -0,0 +1,42 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:intl/intl.dart'; +import 'package:scalar_attendance/api_service.dart'; +import 'package:scalar_attendance/money.dart'; + +void main() { + // The formatter the payslips screen used before org currencies. + String legacyInr(num v) => '₹${NumberFormat('#,##,###').format(v)}'; + + group('formatMoney', () { + test('missing / INR currency is byte-identical to the old rupee output', () { + for (final v in [0, 7, 999, 1000, 54321, 123456.7, 1234567, 98765432.49]) { + expect(formatMoney(v), legacyInr(v)); + expect(formatMoney(v, null), legacyInr(v)); + expect(formatMoney(v, ''), legacyInr(v)); + expect(formatMoney(v, 'INR'), legacyInr(v)); + expect(formatMoney(v, 'inr'), legacyInr(v)); + } + expect(formatMoney(1234567), '₹12,34,567'); + }); + + test('AED uses the ISO code, western grouping and 2 decimals', () { + expect(formatMoney(12345.5, 'AED'), 'AED 12,345.50'); + expect(formatMoney(0, 'AED'), 'AED 0.00'); + }); + + test('BHD uses 3 decimals', () { + expect(formatMoney(1234.5, 'BHD'), 'BHD 1,234.500'); + }); + }); + + group('payslip / profile currency', () { + test('parsed when present, null on older servers', () { + final withCur = Payslip.fromJson({'gid': 'p1', 'netPay': 10, 'currency': 'AED'}); + final without = Payslip.fromJson({'gid': 'p1', 'netPay': 10}); + expect(withCur.currency, 'AED'); + expect(without.currency, isNull); + expect(Profile.fromJson({'currency': 'SAR'}).currency, 'SAR'); + expect(Profile.fromJson({}).currency, isNull); + }); + }); +}