[UNTESTED] Fixes notifiers and adds some additional methods. Adds tests.

Changes:
// ArcaneEnvironment
breaking: context.read<ArcaneEnvironment>() -> ArcaneEnvironment.of(context)
breaking: context.read<ArcaneEnvironment>().state -> ArcaneEnvironment.of(context).environment;

// Feature flag service
added: reset()

// Logging service
added: registerInterface()
added: unregisterInterfaces()
added: unregisterAllInterfaces()

// ArcaneReactiveTheme
fixed: currentMode, dark, light now actually emit new values when changed
added: getters for lightTheme, darkTheme, and systemTheme
TODO: test systemTheme

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2025-04-04 17:08:06 +02:00
parent b129639f1f
commit ac82e93b9d
16 changed files with 1233 additions and 89 deletions
+97
View File
@@ -0,0 +1,97 @@
import "package:arcane_framework/arcane_framework.dart";
import "package:flutter/material.dart";
import "package:flutter_test/flutter_test.dart";
void main() {
group("ArcaneServiceProvider", () {
late List<ArcaneService> testServices;
setUp(() {
testServices = [
MockArcaneService(),
AnotherMockService(),
];
});
testWidgets("provides services to widget tree", (tester) async {
await tester.pumpWidget(
ArcaneApp(
services: testServices,
child: Builder(
builder: (context) {
final provider = ArcaneServiceProvider.of(context);
expect(provider.serviceInstances, equals(testServices));
return const SizedBox();
},
),
),
);
});
testWidgets("serviceOfType extension returns correct service",
(tester) async {
await tester.pumpWidget(
ArcaneApp(
services: testServices,
child: Builder(
builder: (context) {
final service = context.serviceOfType<MockArcaneService>();
expect(service, isNotNull);
expect(service, isA<MockArcaneService>());
return const SizedBox();
},
),
),
);
});
testWidgets("serviceOfType returns null for unregistered service",
(tester) async {
await tester.pumpWidget(
ArcaneApp(
services: testServices,
child: Builder(
builder: (context) {
final service = context.serviceOfType<UnregisteredService>();
expect(service, isNull);
return const SizedBox();
},
),
),
);
});
test("of() throws when no provider is found", () {
final context = MockBuildContext();
expect(
() => ArcaneServiceProvider.of(context),
throwsException,
);
});
testWidgets("updateShouldNotify always returns true", (tester) async {
final provider = ArcaneServiceProvider(
serviceInstances: testServices,
child: const SizedBox(),
);
expect(
provider.updateShouldNotify(
ArcaneServiceProvider(
serviceInstances: testServices,
child: const SizedBox(),
),
),
true,
);
});
});
}
class MockArcaneService extends ArcaneService {}
class AnotherMockService extends ArcaneService {}
class UnregisteredService extends ArcaneService {}
class MockBuildContext extends Fake implements BuildContext {}