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