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