1
+ using System ;
2
+ using System . Collections . Concurrent ;
3
+ using Microsoft . Extensions . Logging ;
4
+ using Microsoft . Extensions . Options ;
5
+ using Moq ;
1
6
using Xunit ;
2
7
3
8
namespace ExcelRna . Extensions . Logging . Tests ;
@@ -8,7 +13,9 @@ public class LogDisplayLoggerProviderTests
8
13
public void CreateLogger_creates_LogDisplayLogger ( )
9
14
{
10
15
// ARRANGE
11
- var provider = new LogDisplayLoggerProvider ( ) ;
16
+ var options = new LogDisplayLoggerOptions ( ) ;
17
+ var optionsMonitor = Mock . Of < IOptionsMonitor < LogDisplayLoggerOptions > > ( monitor => monitor . CurrentValue == options ) ;
18
+ var provider = new LogDisplayLoggerProvider ( optionsMonitor ) ;
12
19
13
20
// ACT
14
21
var logger = provider . CreateLogger ( "Test" ) ;
@@ -21,9 +28,74 @@ public void CreateLogger_creates_LogDisplayLogger()
21
28
public void Dispose_does_not_throw ( )
22
29
{
23
30
// ARRANGE
24
- var provider = new LogDisplayLoggerProvider ( ) ;
31
+ var options = new LogDisplayLoggerOptions ( ) ;
32
+ var optionsMonitor = Mock . Of < IOptionsMonitor < LogDisplayLoggerOptions > > ( monitor => monitor . CurrentValue == options ) ;
33
+ Mock . Get ( optionsMonitor )
34
+ . Setup ( monitor => monitor . OnChange ( It . IsAny < Action < LogDisplayLoggerOptions , string > > ( ) ) )
35
+ . Returns ( Mock . Of < IDisposable > ( ) ) ;
36
+ var provider = new LogDisplayLoggerProvider ( optionsMonitor ) ;
25
37
26
38
// ACT
27
39
provider . Dispose ( ) ;
28
40
}
41
+
42
+ [ Fact ]
43
+ public void Options_changes_are_applied_to_loggers ( )
44
+ {
45
+ // ARRANGE
46
+ var optionsMonitor = new TestOptionsMonitor < LogDisplayLoggerOptions > ( ) ;
47
+ optionsMonitor . Set ( Options . DefaultName , new LogDisplayLoggerOptions { AutoShowLogDisplayThreshold = LogLevel . Error } ) ;
48
+
49
+ var provider = new LogDisplayLoggerProvider ( optionsMonitor ) ;
50
+ var logger = ( LogDisplayLogger ) provider . CreateLogger ( "Test" ) ;
51
+
52
+ // ACT & ASSERT
53
+ Assert . Equal ( LogLevel . Error , logger . Options . AutoShowLogDisplayThreshold ) ;
54
+ optionsMonitor . Set ( Options . DefaultName , new LogDisplayLoggerOptions { AutoShowLogDisplayThreshold = LogLevel . Trace } ) ;
55
+ Assert . Equal ( LogLevel . Trace , logger . Options . AutoShowLogDisplayThreshold ) ;
56
+ }
57
+
58
+ private class TestOptionsMonitor < TOptions > : IOptionsMonitor < TOptions >
59
+ where TOptions : class , new ( )
60
+ {
61
+ private readonly ConcurrentDictionary < string , TOptions > _options = new ( ) ;
62
+ private event Action < TOptions , string > OnChangeEvent ;
63
+
64
+ public TOptions Get ( string name )
65
+ {
66
+ return _options . TryGetValue ( name ?? Options . DefaultName , out var options ) ? options : throw new Exception ( nameof ( name ) ) ;
67
+ }
68
+
69
+ public void Set ( string name , TOptions options )
70
+ {
71
+ _options . TryRemove ( name , out _ ) ;
72
+ _options . TryAdd ( name , options ) ;
73
+ OnChangeEvent ? . Invoke ( options , name ) ;
74
+ }
75
+
76
+ public IDisposable OnChange ( Action < TOptions , string > listener )
77
+ {
78
+ var disposable = new ChangeTrackerDisposable ( this , listener ) ;
79
+ OnChangeEvent += disposable . OnChange ;
80
+ return disposable ;
81
+ }
82
+
83
+ public TOptions CurrentValue => Get ( Options . DefaultName ) ;
84
+
85
+ private class ChangeTrackerDisposable : IDisposable
86
+ {
87
+ private readonly Action < TOptions , string > _listener ;
88
+ private readonly TestOptionsMonitor < TOptions > _monitor ;
89
+
90
+ public ChangeTrackerDisposable ( TestOptionsMonitor < TOptions > monitor , Action < TOptions , string > listener )
91
+ {
92
+ _listener = listener ;
93
+ _monitor = monitor ;
94
+ }
95
+
96
+ public void OnChange ( TOptions options , string name ) => _listener . Invoke ( options , name ) ;
97
+
98
+ public void Dispose ( ) => _monitor . OnChangeEvent -= OnChange ;
99
+ }
100
+ }
29
101
}
0 commit comments