1
+ using Blazored . LocalStorage ;
2
+ using Bunit ;
3
+ using FluentAssertions ;
4
+ using LinkDotNet . Blog . TestUtilities ;
5
+ using LinkDotNet . Blog . Web . Shared ;
6
+ using Microsoft . Extensions . DependencyInjection ;
7
+ using Moq ;
8
+ using Xunit ;
9
+
10
+ namespace LinkDotNet . Blog . UnitTests . Web . Shared
11
+ {
12
+ public class LikeTests : TestContext
13
+ {
14
+ [ Theory ]
15
+ [ InlineData ( 0 , "0 Likes" ) ]
16
+ [ InlineData ( 1 , "1 Like" ) ]
17
+ [ InlineData ( 2 , "2 Likes" ) ]
18
+ public void ShouldDisplayLikes ( int likes , string expectedText )
19
+ {
20
+ Services . AddScoped ( _ => new Mock < ILocalStorageService > ( ) . Object ) ;
21
+ var blogPost = new BlogPostBuilder ( ) . WithLikes ( likes ) . Build ( ) ;
22
+ var cut = RenderComponent < Like > (
23
+ p => p . Add ( l => l . BlogPost , blogPost ) ) ;
24
+
25
+ var label = cut . Find ( "small" ) . TextContent ;
26
+
27
+ label . Should ( ) . Be ( expectedText ) ;
28
+ }
29
+
30
+ [ Fact ]
31
+ public void ShouldInvokeEventWhenButtonClicked ( )
32
+ {
33
+ Services . AddScoped ( _ => new Mock < ILocalStorageService > ( ) . Object ) ;
34
+ var blogPost = new BlogPostBuilder ( ) . Build ( ) ;
35
+ var wasClicked = false ;
36
+ var wasLike = false ;
37
+ var cut = RenderComponent < Like > (
38
+ p => p . Add ( l => l . BlogPost , blogPost )
39
+ . Add ( l => l . OnBlogPostLiked , b =>
40
+ {
41
+ wasClicked = true ;
42
+ wasLike = b ;
43
+ } ) ) ;
44
+
45
+ cut . Find ( "button" ) . Click ( ) ;
46
+
47
+ wasClicked . Should ( ) . BeTrue ( ) ;
48
+ wasLike . Should ( ) . BeTrue ( ) ;
49
+ }
50
+
51
+ [ Fact ]
52
+ public void ShouldSetLocalStorageVariableOnClick ( )
53
+ {
54
+ var localStorage = new Mock < ILocalStorageService > ( ) ;
55
+ Services . AddScoped ( _ => localStorage . Object ) ;
56
+ var blogPost = new BlogPostBuilder ( ) . Build ( ) ;
57
+ var cut = RenderComponent < Like > (
58
+ p => p . Add ( l => l . BlogPost , blogPost ) ) ;
59
+
60
+ cut . Find ( "button" ) . Click ( ) ;
61
+
62
+ localStorage . Verify ( l => l . SetItemAsync ( "hasLiked" , true , default ) , Times . Once ) ;
63
+ }
64
+
65
+ [ Fact ]
66
+ public void ShouldCheckLocalStorageOnInit ( )
67
+ {
68
+ var localStorage = new Mock < ILocalStorageService > ( ) ;
69
+ localStorage . Setup ( l => l . ContainKeyAsync ( "hasLiked" , default ) ) . ReturnsAsync ( true ) ;
70
+ localStorage . Setup ( l => l . GetItemAsync < bool > ( "hasLiked" , default ) ) . ReturnsAsync ( true ) ;
71
+ Services . AddScoped ( _ => localStorage . Object ) ;
72
+ var blogPost = new BlogPostBuilder ( ) . Build ( ) ;
73
+ var wasLike = true ;
74
+ var cut = RenderComponent < Like > (
75
+ p => p . Add ( l => l . BlogPost , blogPost )
76
+ . Add ( l => l . OnBlogPostLiked , b => wasLike = b ) ) ;
77
+
78
+ cut . Find ( "button" ) . Click ( ) ;
79
+
80
+ wasLike . Should ( ) . BeFalse ( ) ;
81
+ }
82
+
83
+ [ Fact ]
84
+ public void ShouldCheckStorageOnClickAgainAndDoNothingOnMismatch ( )
85
+ {
86
+ var localStorage = new Mock < ILocalStorageService > ( ) ;
87
+ Services . AddScoped ( _ => localStorage . Object ) ;
88
+ var blogPost = new BlogPostBuilder ( ) . Build ( ) ;
89
+ var wasClicked = false ;
90
+ var cut = RenderComponent < Like > (
91
+ p => p . Add ( l => l . BlogPost , blogPost )
92
+ . Add ( l => l . OnBlogPostLiked , _ => wasClicked = true ) ) ;
93
+ localStorage . Setup ( l => l . ContainKeyAsync ( "hasLiked" , default ) ) . ReturnsAsync ( true ) ;
94
+ localStorage . Setup ( l => l . GetItemAsync < bool > ( "hasLiked" , default ) ) . ReturnsAsync ( true ) ;
95
+
96
+ cut . Find ( "button" ) . Click ( ) ;
97
+
98
+ wasClicked . Should ( ) . BeFalse ( ) ;
99
+ }
100
+ }
101
+ }
0 commit comments