mirror of
https://github.com/hanskokx/arcane_framework.git
synced 2026-05-14 10:29:06 +02:00
ac82e93b9d
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>
204 lines
5.6 KiB
Dart
204 lines
5.6 KiB
Dart
import "package:arcane_framework/arcane_framework.dart";
|
|
import "package:flutter_test/flutter_test.dart";
|
|
import "package:mockito/annotations.dart";
|
|
import "package:mockito/mockito.dart";
|
|
|
|
import "logging_service_test.mocks.dart";
|
|
|
|
class MyOtherLoggingInterface extends Mock implements MockLoggingInterface {}
|
|
|
|
@GenerateNiceMocks([
|
|
MockSpec<LoggingInterface>(
|
|
onMissingStub: OnMissingStub.returnDefault,
|
|
),
|
|
])
|
|
void main() {
|
|
final LoggingInterface myInterface = MockLoggingInterface();
|
|
|
|
setUp(() {
|
|
Arcane.logger.reset();
|
|
});
|
|
|
|
group("ArcaneLogger", () {
|
|
group("interface management", () {
|
|
test("registerInterfaces adds interfaces correctly", () async {
|
|
await Arcane.logger.registerInterface(myInterface);
|
|
|
|
expect(
|
|
Arcane.logger.interfaces,
|
|
contains(isA<LoggingInterface>()),
|
|
);
|
|
});
|
|
|
|
test("registering an interface doesn't initialize it", () async {
|
|
await Arcane.logger.registerInterface(myInterface);
|
|
|
|
expect(Arcane.logger.interfaces.first, isA<LoggingInterface>());
|
|
|
|
expect(myInterface.initialized, false);
|
|
verifyNever(myInterface.init());
|
|
});
|
|
|
|
test("registering an interface initializes the logger", () async {
|
|
expect(Arcane.logger.initialized, false);
|
|
|
|
await Arcane.logger.registerInterface(myInterface);
|
|
|
|
expect(Arcane.logger.initialized, true);
|
|
});
|
|
|
|
test("interfaces can be initialized through the logger", () async {
|
|
await Arcane.logger.registerInterface(myInterface);
|
|
|
|
expect(Arcane.logger.interfaces.first.initialized, false);
|
|
|
|
await Arcane.logger.initializeInterfaces();
|
|
|
|
verify(Arcane.logger.interfaces.first.init()).called(1);
|
|
});
|
|
|
|
test("multiple interfaces can be registered", () async {
|
|
await Arcane.logger.registerInterfaces([
|
|
MockLoggingInterface(),
|
|
MyOtherLoggingInterface(),
|
|
]);
|
|
|
|
expect(
|
|
Arcane.logger.interfaces,
|
|
contains(isA<MockLoggingInterface>()),
|
|
);
|
|
expect(
|
|
Arcane.logger.interfaces,
|
|
contains(isA<MyOtherLoggingInterface>()),
|
|
);
|
|
});
|
|
});
|
|
|
|
group("persistent metadata", () {
|
|
test("addPersistentMetadata adds metadata correctly", () {
|
|
Arcane.logger.addPersistentMetadata({"test": "value"});
|
|
expect(Arcane.logger.additionalMetadata["test"], equals("value"));
|
|
});
|
|
|
|
test("removePersistentMetadata removes specific key", () {
|
|
Arcane.logger.addPersistentMetadata({"test": "value", "keep": "this"});
|
|
Arcane.logger.removePersistentMetadata("test");
|
|
expect(Arcane.logger.additionalMetadata.containsKey("test"), false);
|
|
expect(Arcane.logger.additionalMetadata["keep"], equals("this"));
|
|
});
|
|
|
|
test("clearPersistentMetadata removes all metadata", () {
|
|
Arcane.logger
|
|
.addPersistentMetadata({"test": "value", "another": "value"});
|
|
Arcane.logger.clearPersistentMetadata();
|
|
expect(Arcane.logger.additionalMetadata.isEmpty, true);
|
|
});
|
|
});
|
|
|
|
group("logging messages", () {
|
|
const String logMessage = "Test";
|
|
|
|
setUp(() async {
|
|
await Arcane.logger.registerInterface(myInterface);
|
|
});
|
|
|
|
test("logging a basic message works", () async {
|
|
Arcane.log(logMessage);
|
|
|
|
verify(
|
|
myInterface.log(
|
|
logMessage,
|
|
metadata: anyNamed("metadata"),
|
|
level: anyNamed("level"),
|
|
stackTrace: anyNamed("stackTrace"),
|
|
extra: anyNamed("extra"),
|
|
),
|
|
).called(1);
|
|
});
|
|
|
|
test("logging at a different level works", () async {
|
|
Arcane.log(
|
|
logMessage,
|
|
level: Level.info,
|
|
);
|
|
|
|
verify(
|
|
myInterface.log(
|
|
logMessage,
|
|
metadata: anyNamed("metadata"),
|
|
level: Level.info,
|
|
stackTrace: anyNamed("stackTrace"),
|
|
extra: anyNamed("extra"),
|
|
),
|
|
).called(1);
|
|
|
|
Arcane.log(
|
|
logMessage,
|
|
level: Level.warning,
|
|
);
|
|
|
|
verify(
|
|
myInterface.log(
|
|
logMessage,
|
|
metadata: anyNamed("metadata"),
|
|
level: Level.warning,
|
|
stackTrace: anyNamed("stackTrace"),
|
|
extra: anyNamed("extra"),
|
|
),
|
|
).called(1);
|
|
});
|
|
|
|
test("logging a stacktrace works", () async {
|
|
final stackTrace = StackTrace.current;
|
|
Arcane.log(logMessage, stackTrace: stackTrace);
|
|
|
|
verify(
|
|
myInterface.log(
|
|
logMessage,
|
|
metadata: anyNamed("metadata"),
|
|
level: anyNamed("level"),
|
|
stackTrace: stackTrace,
|
|
extra: anyNamed("extra"),
|
|
),
|
|
).called(1);
|
|
});
|
|
|
|
test("logging an extra object works", () async {
|
|
const bool extraObject = true;
|
|
Arcane.log(
|
|
logMessage,
|
|
extra: extraObject,
|
|
);
|
|
|
|
verify(
|
|
myInterface.log(
|
|
logMessage,
|
|
metadata: anyNamed("metadata"),
|
|
level: anyNamed("level"),
|
|
stackTrace: anyNamed("stackTrace"),
|
|
extra: extraObject,
|
|
),
|
|
).called(1);
|
|
});
|
|
|
|
test("logging metadata works", () async {
|
|
final Map<String, String> metadata = {"test": "value"};
|
|
Arcane.log(
|
|
logMessage,
|
|
metadata: metadata,
|
|
);
|
|
|
|
verify(
|
|
myInterface.log(
|
|
logMessage,
|
|
metadata: metadata,
|
|
level: anyNamed("level"),
|
|
stackTrace: anyNamed("stackTrace"),
|
|
extra: anyNamed("extra"),
|
|
),
|
|
).called(1);
|
|
});
|
|
});
|
|
});
|
|
}
|