testsAndMisc/billsplit/test/xlsx_export_test.dart
Krzysztof Rudnicki c600760e71 Move billsplit Flutter app into the monorepo
billsplit was a standalone Flutter app in ~/Downloads with one commit and no
git remote — that directory was the only copy of its history.

Three things the move needed beyond copying the tree:

- The root .gitignore silently swallowed 32 of its files (*.png, *.ico,
  *.manifest). Ignored files do not error on `git add`, they just vanish, so
  this would have committed an app that cannot build. Added a trailing block
  of ! overrides plus .binary-allowlist (which did not exist yet) — the
  documented in-repo exception for binaries a build genuinely needs. The
  ../testsAndMisc_binaries/ symlink scheme does not apply: those directories
  are gone, and a symlinked PNG breaks a fresh clone.

- billsplit/.github/workflows/ci.yaml was inert once nested; GitHub only reads
  workflows at the repository root. Relocated with a working-directory and a
  billsplit/** path filter.

- The app's coverage gate moved to python_pkg/billsplit_coverage/ so every
  Python file stays under python_pkg/, and gained a test suite at 100% branch
  coverage as that location requires. billsplit/ now holds only Dart.

Also replaces the stock Flutter icon with a family icon from the shared
generator. The glyph is a filled silhouette because the family's 72px stroke
cannot carry a fine torn edge, and the split is an evenodd-cut perforation so
the holes stay transparent on the foreground and monochrome layers.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 12:22:22 +02:00

32 lines
1.0 KiB
Dart

import 'dart:io';
import 'package:billsplit/domain/eparagon_parser.dart';
import 'package:billsplit/domain/models.dart';
import 'package:billsplit/domain/xlsx_export.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
test('exports a non-trivial xlsx for the real receipt', () {
final receipt = parseEParagon(
File('test/fixtures/sample_receipt.json').readAsStringSync(),
);
final people = [
for (var i = 0; i < 8; i++)
Person(id: 'p$i', name: 'Person ${i + 1}', drinks: i < 6),
];
receipt.participantIds.addAll(people.map((p) => p.id));
final bytes = exportXlsx(receipt: receipt, roster: people, groups: []);
expect(bytes.length, greaterThan(4000));
// PK zip magic.
expect(bytes[0], 0x50);
expect(bytes[1], 0x4B);
// Write out for external validation (recalc via LibreOffice + openpyxl).
final out = File('build/test_export.xlsx')
..createSync(recursive: true)
..writeAsBytesSync(bytes);
expect(out.existsSync(), isTrue);
});
}