1+ using PubnubApi ;
2+ using PubnubChatApi ;
3+ using Channel = PubnubChatApi . Channel ;
4+
5+ namespace PubNubChatApi . Tests ;
6+
7+ [ TestFixture ]
8+ public class FilesTests
9+ {
10+ private Chat chat ;
11+ private Channel channel ;
12+ private User user ;
13+
14+ [ SetUp ]
15+ public async Task Setup ( )
16+ {
17+ chat = TestUtils . AssertOperation ( await Chat . CreateInstance ( new PubnubChatConfig ( ) ,
18+ new PNConfiguration ( new UserId ( "file_tests_user" ) )
19+ {
20+ PublishKey = PubnubTestsParameters . PublishKey ,
21+ SubscribeKey = PubnubTestsParameters . SubscribeKey
22+ } ) ) ;
23+ channel = TestUtils . AssertOperation ( await chat . CreatePublicConversation ( "file_tests_channel" ) ) ;
24+ user = TestUtils . AssertOperation ( await chat . GetCurrentUser ( ) ) ;
25+ await channel . Join ( ) ;
26+ await Task . Delay ( 3500 ) ;
27+ }
28+
29+ [ TearDown ]
30+ public async Task CleanUp ( )
31+ {
32+ await ClearChannelOfFiles ( ) ;
33+ await channel . Leave ( ) ;
34+ await Task . Delay ( 3000 ) ;
35+ chat . Destroy ( ) ;
36+ await Task . Delay ( 3000 ) ;
37+ }
38+
39+ private async Task ClearChannelOfFiles ( )
40+ {
41+ var files = await channel . GetFiles ( ) ;
42+ if ( files . Error )
43+ {
44+ Assert . Fail ( $ "Error in files cleanup: { files . Exception . Message } ") ;
45+ return ;
46+ }
47+
48+ foreach ( var file in files . Result . Files )
49+ {
50+ var result = await channel . DeleteFile ( file . Id , file . Name ) ;
51+ if ( result . Error )
52+ {
53+ Assert . Fail ( $ "Error in files cleanup: { files . Exception . Message } ") ;
54+ }
55+ }
56+ }
57+
58+ [ Test ]
59+ public async Task TestFileUploadInMessage ( )
60+ {
61+ //Cleanup: delete files from channel
62+ await ClearChannelOfFiles ( ) ;
63+
64+ var receivedMessageReset = new ManualResetEvent ( false ) ;
65+ Message receivedMessage = null ;
66+ channel . OnMessageReceived += message =>
67+ {
68+ if ( message . MessageText == "FILE" )
69+ {
70+ receivedMessage = message ;
71+ receivedMessageReset . Set ( ) ;
72+ }
73+ } ;
74+
75+ //Add file to SendTextParams and send message
76+ TestUtils . AssertOperation ( await channel . SendText ( "FILE" , new SendTextParams ( )
77+ {
78+ Files =
79+ [
80+ new ChatInputFile ( )
81+ {
82+ Name = "the_file" ,
83+ Type = "text" ,
84+ Source = "fileupload.txt"
85+ }
86+ ]
87+ } ) ) ;
88+
89+ //Receive message and check message.Files
90+ var received = receivedMessageReset . WaitOne ( 10000 ) ;
91+ Assert . True ( received , "Did not receive message with file at all!" ) ;
92+ Assert . True ( receivedMessage != null , "receivedMessage was null!" ) ;
93+ Assert . True ( receivedMessage . Files != null , "receivedMessage.Files was null!" ) ;
94+ Assert . True ( receivedMessage . Files . Count == 1 ,
95+ $ "receivedMessage.Files.Count was { receivedMessage . Files . Count } instead of 1!") ;
96+ var receivedFile = receivedMessage . Files [ 0 ] ;
97+ Assert . True ( receivedFile . Name == "the_file" ,
98+ $ "Expected file name \" the_file\" but got \" { receivedFile . Name } \" ") ;
99+ Assert . True ( receivedFile . Type == "text" , $ "Expected file type \" text\" but got \" { receivedFile . Type } \" ") ;
100+ Assert . True ( ! string . IsNullOrEmpty ( receivedFile . Id ) , "File ID is empty" ) ;
101+ Assert . True ( ! string . IsNullOrEmpty ( receivedFile . Url ) , "File URL is empty" ) ;
102+
103+ //Check channel.GetFiles() for the file and check if data matches with the one from message.Files
104+ var channelFiles = TestUtils . AssertOperation ( await channel . GetFiles ( ) ) ;
105+ Assert . True (
106+ channelFiles . Files . Any ( x =>
107+ x . Id == receivedFile . Id && x . Name == receivedFile . Name && x . Url == receivedFile . Url ) ,
108+ "Did not find message file in channel.GetFiles()!" ) ;
109+ }
110+
111+ [ Test ]
112+ public async Task TestFileUploadInMessageDraft ( )
113+ {
114+ //Cleanup: delete files from channel
115+ await ClearChannelOfFiles ( ) ;
116+
117+ var receivedMessageReset = new ManualResetEvent ( false ) ;
118+ Message receivedMessage = null ;
119+ channel . OnMessageReceived += message =>
120+ {
121+ if ( message . MessageText == "FILE" )
122+ {
123+ receivedMessage = message ;
124+ receivedMessageReset . Set ( ) ;
125+ }
126+ } ;
127+
128+ //Add file to SendTextParams in a MessageDraft and send message
129+ var messageDraft = channel . CreateMessageDraft ( ) ;
130+ messageDraft . InsertText ( 0 , "FILE" ) ;
131+ messageDraft . Files . Add ( new ChatInputFile ( )
132+ {
133+ Name = "the_file" ,
134+ Type = "text" ,
135+ Source = "fileupload.txt"
136+ } ) ;
137+
138+ TestUtils . AssertOperation ( await messageDraft . Send ( ) ) ;
139+
140+ //Receive message and check message.Files
141+ var received = receivedMessageReset . WaitOne ( 10000 ) ;
142+ Assert . True ( received , "Did not receive message with file at all!" ) ;
143+ Assert . True ( receivedMessage != null , "receivedMessage was null!" ) ;
144+ Assert . True ( receivedMessage . Files != null , "receivedMessage.Files was null!" ) ;
145+ Assert . True ( receivedMessage . Files . Count == 1 ,
146+ $ "receivedMessage.Files.Count was { receivedMessage . Files . Count } instead of 1!") ;
147+ var receivedFile = receivedMessage . Files [ 0 ] ;
148+ Assert . True ( receivedFile . Name == "the_file" ,
149+ $ "Expected file name \" the_file\" but got \" { receivedFile . Name } \" ") ;
150+ Assert . True ( receivedFile . Type == "text" , $ "Expected file type \" text\" but got \" { receivedFile . Type } \" ") ;
151+ Assert . True ( ! string . IsNullOrEmpty ( receivedFile . Id ) , "File ID is empty" ) ;
152+ Assert . True ( ! string . IsNullOrEmpty ( receivedFile . Url ) , "File URL is empty" ) ;
153+
154+ //Check channel.GetFiles() for the file and check if data matches with the one from message.Files
155+ var channelFiles = TestUtils . AssertOperation ( await channel . GetFiles ( ) ) ;
156+ Assert . True (
157+ channelFiles . Files . Any ( x =>
158+ x . Id == receivedFile . Id && x . Name == receivedFile . Name && x . Url == receivedFile . Url ) ,
159+ "Did not find message file in channel.GetFiles()!" ) ;
160+ }
161+
162+ [ Test ]
163+ public async Task TestFileUploadErrorHandling ( )
164+ {
165+ var receivedMessageReset = new ManualResetEvent ( false ) ;
166+ channel . OnMessageReceived += message =>
167+ {
168+ if ( message . MessageText == "FILE TOO BIG" )
169+ {
170+ receivedMessageReset . Set ( ) ;
171+ }
172+ } ;
173+
174+ var sendResult = await channel . SendText ( "FILE TOO BIG" , new SendTextParams ( )
175+ {
176+ Files =
177+ [
178+ new ChatInputFile ( )
179+ {
180+ Name = "the_BIG_file" ,
181+ Type = "image" ,
182+ Source = "file_large.png"
183+ }
184+ ]
185+ } ) ;
186+ Assert . True ( sendResult . Error , "sendResult.Error should be true for file over size limit" ) ;
187+ Assert . True ( sendResult . Exception . Message . Contains ( "Your proposed upload exceeds the maximum allowed size" ) , "Error message should contain info about file size" ) ;
188+
189+ var received = receivedMessageReset . WaitOne ( 5000 ) ;
190+ Assert . False ( received , "SendText should abort and not send message in case of file upload error" ) ;
191+ }
192+ }
0 commit comments