1313import org .junit .Rule ;
1414import org .junit .Test ;
1515import org .junit .rules .TemporaryFolder ;
16+ import org .mockito .ArgumentCaptor ;
1617import org .mockito .Matchers ;
1718
1819import java .io .File ;
2122
2223import bolts .Task ;
2324
25+ import static org .junit .Assert .assertArrayEquals ;
2426import static org .junit .Assert .assertEquals ;
2527import static org .junit .Assert .assertFalse ;
28+ import static org .junit .Assert .assertNull ;
2629import static org .junit .Assert .assertTrue ;
2730import static org .mockito .Matchers .any ;
2831import static org .mockito .Mockito .mock ;
2932import static org .mockito .Mockito .never ;
33+ import static org .mockito .Mockito .times ;
3034import static org .mockito .Mockito .verify ;
3135import static org .mockito .Mockito .when ;
3236
@@ -50,30 +54,41 @@ public void testConstructor() throws Exception {
5054 String name = "name" ;
5155 byte [] data = "hello" .getBytes ();
5256 String contentType = "content_type" ;
53-
54- ParseFile file = new ParseFile (name , data , contentType );
55- assertEquals ("name" , file .getName ());
56- assertEquals ("hello" , new String (file .getData ()));
57- assertEquals ("content_type" , file .getState ().mimeType ());
58- assertTrue (file .isDirty ());
59-
60- file = new ParseFile (data );
61- assertEquals ("file" , file .getName ()); // Default
62- assertEquals ("hello" , new String (file .getData ()));
63- assertEquals (null , file .getState ().mimeType ());
64- assertTrue (file .isDirty ());
65-
66- file = new ParseFile (name , data );
67- assertEquals ("name" , file .getName ());
68- assertEquals ("hello" , new String (file .getData ()));
69- assertEquals (null , file .getState ().mimeType ());
70- assertTrue (file .isDirty ());
71-
72- file = new ParseFile (data , contentType );
73- assertEquals ("file" , file .getName ()); // Default
74- assertEquals ("hello" , new String (file .getData ()));
75- assertEquals ("content_type" , file .getState ().mimeType ());
76- assertTrue (file .isDirty ());
57+ File file = temporaryFolder .newFile (name );
58+
59+ ParseFile parseFile = new ParseFile (name , data , contentType );
60+ assertEquals ("name" , parseFile .getName ());
61+ assertEquals ("hello" , new String (parseFile .getData ()));
62+ assertEquals ("content_type" , parseFile .getState ().mimeType ());
63+ assertTrue (parseFile .isDirty ());
64+
65+ parseFile = new ParseFile (data );
66+ assertEquals ("file" , parseFile .getName ()); // Default
67+ assertEquals ("hello" , new String (parseFile .getData ()));
68+ assertEquals (null , parseFile .getState ().mimeType ());
69+ assertTrue (parseFile .isDirty ());
70+
71+ parseFile = new ParseFile (name , data );
72+ assertEquals ("name" , parseFile .getName ());
73+ assertEquals ("hello" , new String (parseFile .getData ()));
74+ assertEquals (null , parseFile .getState ().mimeType ());
75+ assertTrue (parseFile .isDirty ());
76+
77+ parseFile = new ParseFile (data , contentType );
78+ assertEquals ("file" , parseFile .getName ()); // Default
79+ assertEquals ("hello" , new String (parseFile .getData ()));
80+ assertEquals ("content_type" , parseFile .getState ().mimeType ());
81+ assertTrue (parseFile .isDirty ());
82+
83+ // TODO(mengyan): Test file pointer in ParseFile when we have proper stage strategy
84+ parseFile = new ParseFile (file );
85+ assertEquals (name , parseFile .getName ()); // Default
86+ assertEquals (null , parseFile .getState ().mimeType ());
87+ assertTrue (parseFile .isDirty ());
88+
89+ parseFile = new ParseFile (file , contentType );
90+ assertEquals (name , parseFile .getName ()); // Default
91+ assertEquals ("content_type" , parseFile .getState ().mimeType ());
7792 }
7893
7994 @ Test (expected = IllegalArgumentException .class )
@@ -157,6 +172,82 @@ public void testSaveAsyncCancelled() throws Exception {
157172 Matchers .<Task <Void >>any ());
158173 }
159174
175+ @ Test
176+ public void testSaveAsyncSuccessWithData () throws Exception {
177+ String name = "name" ;
178+ byte [] data = "hello" .getBytes ();
179+ String contentType = "content_type" ;
180+ String url = "url" ;
181+ ParseFile .State state = new ParseFile .State .Builder ()
182+ .url (url )
183+ .build ();
184+ ParseFileController controller = mock (ParseFileController .class );
185+ when (controller .saveAsync (
186+ any (ParseFile .State .class ),
187+ any (byte [].class ),
188+ any (String .class ),
189+ any (ProgressCallback .class ),
190+ Matchers .<Task <Void >>any ())).thenReturn (Task .forResult (state ));
191+ ParseCorePlugins .getInstance ().registerFileController (controller );
192+
193+ ParseFile parseFile = new ParseFile (name , data , contentType );
194+ ParseTaskUtils .wait (parseFile .saveAsync (null , null , null ));
195+
196+ // Verify controller get the correct data
197+ ArgumentCaptor <ParseFile .State > stateCaptor = ArgumentCaptor .forClass (ParseFile .State .class );
198+ ArgumentCaptor <byte []> dataCaptor = ArgumentCaptor .forClass (byte [].class );
199+ verify (controller , times (1 )).saveAsync (
200+ stateCaptor .capture (),
201+ dataCaptor .capture (),
202+ any (String .class ),
203+ any (ProgressCallback .class ),
204+ Matchers .<Task <Void >>any ());
205+ assertNull (stateCaptor .getValue ().url ());
206+ assertEquals (name , stateCaptor .getValue ().name ());
207+ assertEquals (contentType , stateCaptor .getValue ().mimeType ());
208+ assertArrayEquals (data , dataCaptor .getValue ());
209+ // Verify the state of ParseFile has been updated
210+ assertEquals (url , parseFile .getUrl ());
211+ }
212+
213+ @ Test
214+ public void testSaveAsyncSuccessWithFile () throws Exception {
215+ String name = "name" ;
216+ File file = temporaryFolder .newFile (name );
217+ String contentType = "content_type" ;
218+ String url = "url" ;
219+ ParseFile .State state = new ParseFile .State .Builder ()
220+ .url (url )
221+ .build ();
222+ ParseFileController controller = mock (ParseFileController .class );
223+ when (controller .saveAsync (
224+ any (ParseFile .State .class ),
225+ any (File .class ),
226+ any (String .class ),
227+ any (ProgressCallback .class ),
228+ Matchers .<Task <Void >>any ())).thenReturn (Task .forResult (state ));
229+ ParseCorePlugins .getInstance ().registerFileController (controller );
230+
231+ ParseFile parseFile = new ParseFile (file , contentType );
232+ ParseTaskUtils .wait (parseFile .saveAsync (null , null , null ));
233+
234+ // Verify controller get the correct data
235+ ArgumentCaptor <ParseFile .State > stateCaptor = ArgumentCaptor .forClass (ParseFile .State .class );
236+ ArgumentCaptor <File > fileCaptor = ArgumentCaptor .forClass (File .class );
237+ verify (controller , times (1 )).saveAsync (
238+ stateCaptor .capture (),
239+ fileCaptor .capture (),
240+ any (String .class ),
241+ any (ProgressCallback .class ),
242+ Matchers .<Task <Void >>any ());
243+ assertNull (stateCaptor .getValue ().url ());
244+ assertEquals (name , stateCaptor .getValue ().name ());
245+ assertEquals (contentType , stateCaptor .getValue ().mimeType ());
246+ assertEquals (file , fileCaptor .getValue ());
247+ // Verify the state of ParseFile has been updated
248+ assertEquals (url , parseFile .getUrl ());
249+ }
250+
160251 // TODO(grantland): testSaveAsyncNotDirtyAfterQueueAwait
161252 // TODO(grantland): testSaveAsyncSuccess
162253 // TODO(grantland): testSaveAsyncFailure
@@ -177,6 +268,12 @@ public void testTaskQueuedMethods() throws Exception {
177268 any (String .class ),
178269 any (ProgressCallback .class ),
179270 Matchers .<Task <Void >>any ())).thenReturn (Task .forResult (state ));
271+ when (controller .saveAsync (
272+ any (ParseFile .State .class ),
273+ any (File .class ),
274+ any (String .class ),
275+ any (ProgressCallback .class ),
276+ Matchers .<Task <Void >>any ())).thenReturn (Task .forResult (state ));
180277 when (controller .fetchAsync (
181278 any (ParseFile .State .class ),
182279 any (String .class ),
0 commit comments