1 package expo.modules.medialibrary.albums
2 
3 import android.os.Bundle
4 import android.provider.MediaStore.Images.Media
5 import expo.modules.medialibrary.AlbumException
6 import expo.modules.medialibrary.ERROR_UNABLE_TO_LOAD
7 import expo.modules.medialibrary.ERROR_UNABLE_TO_LOAD_PERMISSION
8 import expo.modules.medialibrary.MockContext
9 import expo.modules.medialibrary.MockData
10 import expo.modules.medialibrary.mockContentResolver
11 import expo.modules.medialibrary.mockCursor
12 import expo.modules.medialibrary.throwableContentResolver
13 import expo.modules.test.core.PromiseMock
14 import expo.modules.test.core.assertRejectedWithCode
15 import expo.modules.test.core.promiseResolvedWithType
16 import org.junit.Assert.assertEquals
17 import org.junit.Assert.assertThrows
18 import org.junit.Before
19 import org.junit.Test
20 import org.junit.runner.RunWith
21 import org.robolectric.RobolectricTestRunner
22 
23 @RunWith(RobolectricTestRunner::class)
24 class GetAlbumsTests {
25 
26   private lateinit var promise: PromiseMock
27   private lateinit var mockContext: MockContext
28 
29   @Before
setUpnull30   fun setUp() {
31     promise = PromiseMock()
32     mockContext = MockContext()
33   }
34 
35   @Test
GetAlbums should resolve with correct responsenull36   fun `GetAlbums should resolve with correct response`() {
37     // arrange
38     val bucketDisplayName = "Some Album Name"
39 
40     val cursor = mockCursor(
41       arrayOf(
42         arrayOf(*MockData.mockImage.toColumnArray(), bucketDisplayName),
43         arrayOf(*MockData.mockVideo.toColumnArray(), bucketDisplayName)
44       )
45     )
46     cursor.setColumnNames(arrayListOf(*cursor.columnNames, Media.BUCKET_DISPLAY_NAME))
47 
48     val context = mockContext with mockContentResolver(cursor)
49 
50     // act
51     GetAlbums(context, promise).execute()
52 
53     // assert
54     promiseResolvedWithType<List<Bundle>>(promise) {
55       assertEquals(1, it.size)
56 
57       val firstAlbum = it[0]
58       assertEquals(MockData.MOCK_ALBUM_ID, firstAlbum.getString("id"))
59       assertEquals(2, firstAlbum.getInt("assetCount"))
60       assertEquals(bucketDisplayName, firstAlbum.getString("title"))
61     }
62   }
63 
64   @Test
GetAlbums should not list albums with null namenull65   fun `GetAlbums should not list albums with null name`() {
66     // arrange
67     val bucketId = 123456
68     val bucketDisplayName = null
69 
70     val cursor = mockCursor(
71       arrayOf(
72         arrayOf(bucketId, bucketDisplayName)
73       )
74     )
75     cursor.setColumnNames(arrayListOf(Media.BUCKET_ID, Media.BUCKET_DISPLAY_NAME))
76 
77     val context = mockContext with mockContentResolver(cursor)
78 
79     // act
80     GetAlbums(context, promise).execute()
81 
82     // assert
83     promiseResolvedWithType<List<Bundle>>(promise) {
84       assertEquals(0, it.size)
85     }
86   }
87 
88   @Test
GetAlbums should reject on null cursornull89   fun `GetAlbums should reject on null cursor`() {
90     // arrange
91     val context = mockContext with mockContentResolver(null)
92 
93     // act
94     // assert
95     assertThrows(AlbumException::class.java) {
96       GetAlbums(context, promise).execute()
97     }
98   }
99 
100   @Test
GetAlbums should reject on SecurityExceptionnull101   fun `GetAlbums should reject on SecurityException`() {
102     // arrange
103     val context = mockContext with throwableContentResolver(SecurityException())
104 
105     // act
106     GetAlbums(context, promise).execute()
107 
108     // assert
109     assertRejectedWithCode(promise, ERROR_UNABLE_TO_LOAD_PERMISSION)
110   }
111 
112   @Test
GetAlbums should reject on IllegalArgumentExceptionnull113   fun `GetAlbums should reject on IllegalArgumentException`() {
114     // arrange
115     val context = mockContext with throwableContentResolver(IllegalArgumentException())
116 
117     // act
118     GetAlbums(context, promise).execute()
119 
120     // assert
121     assertRejectedWithCode(promise, ERROR_UNABLE_TO_LOAD)
122   }
123 }
124