[PM-20192] Migrate CiphersService to network module (#5052)

This commit is contained in:
Patrick Honkonen 2025-04-16 11:08:17 -04:00 committed by GitHub
parent 83de8b888d
commit 2d416eade5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 53 additions and 69 deletions

View File

@ -1,10 +1,10 @@
package com.x8bit.bitwarden.data.vault.datasource.network.di package com.x8bit.bitwarden.data.vault.datasource.network.di
import com.bitwarden.network.service.CiphersService
import com.bitwarden.network.service.CiphersServiceImpl
import com.bitwarden.network.service.FolderService import com.bitwarden.network.service.FolderService
import com.bitwarden.network.service.FolderServiceImpl import com.bitwarden.network.service.FolderServiceImpl
import com.x8bit.bitwarden.data.platform.datasource.network.retrofit.Retrofits import com.x8bit.bitwarden.data.platform.datasource.network.retrofit.Retrofits
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersService
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersServiceImpl
import com.x8bit.bitwarden.data.vault.datasource.network.service.DownloadService import com.x8bit.bitwarden.data.vault.datasource.network.service.DownloadService
import com.x8bit.bitwarden.data.vault.datasource.network.service.DownloadServiceImpl import com.x8bit.bitwarden.data.vault.datasource.network.service.DownloadServiceImpl
import com.x8bit.bitwarden.data.vault.datasource.network.service.SendsService import com.x8bit.bitwarden.data.vault.datasource.network.service.SendsService

View File

@ -9,6 +9,8 @@ import com.bitwarden.network.model.AttachmentJsonResponse
import com.bitwarden.network.model.CreateCipherInOrganizationJsonRequest import com.bitwarden.network.model.CreateCipherInOrganizationJsonRequest
import com.bitwarden.network.model.ShareCipherJsonRequest import com.bitwarden.network.model.ShareCipherJsonRequest
import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest
import com.bitwarden.network.model.UpdateCipherResponseJson
import com.bitwarden.network.service.CiphersService
import com.bitwarden.vault.AttachmentView import com.bitwarden.vault.AttachmentView
import com.bitwarden.vault.Cipher import com.bitwarden.vault.Cipher
import com.bitwarden.vault.CipherView import com.bitwarden.vault.CipherView
@ -16,8 +18,6 @@ import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource
import com.x8bit.bitwarden.data.platform.error.NoActiveUserException import com.x8bit.bitwarden.data.platform.error.NoActiveUserException
import com.x8bit.bitwarden.data.platform.manager.ReviewPromptManager import com.x8bit.bitwarden.data.platform.manager.ReviewPromptManager
import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource
import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateCipherResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersService
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource
import com.x8bit.bitwarden.data.vault.manager.model.DownloadResult import com.x8bit.bitwarden.data.vault.manager.model.DownloadResult
import com.x8bit.bitwarden.data.vault.repository.model.CreateAttachmentResult import com.x8bit.bitwarden.data.vault.repository.model.CreateAttachmentResult

View File

@ -2,6 +2,7 @@ package com.x8bit.bitwarden.data.vault.manager.di
import android.content.Context import android.content.Context
import com.bitwarden.data.manager.DispatcherManager import com.bitwarden.data.manager.DispatcherManager
import com.bitwarden.network.service.CiphersService
import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource
import com.x8bit.bitwarden.data.auth.datasource.sdk.AuthSdkSource import com.x8bit.bitwarden.data.auth.datasource.sdk.AuthSdkSource
import com.x8bit.bitwarden.data.auth.manager.TrustedDeviceManager import com.x8bit.bitwarden.data.auth.manager.TrustedDeviceManager
@ -10,7 +11,6 @@ import com.x8bit.bitwarden.data.platform.manager.AppStateManager
import com.x8bit.bitwarden.data.platform.manager.ReviewPromptManager import com.x8bit.bitwarden.data.platform.manager.ReviewPromptManager
import com.x8bit.bitwarden.data.platform.repository.SettingsRepository import com.x8bit.bitwarden.data.platform.repository.SettingsRepository
import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersService
import com.x8bit.bitwarden.data.vault.datasource.network.service.DownloadService import com.x8bit.bitwarden.data.vault.datasource.network.service.DownloadService
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource
import com.x8bit.bitwarden.data.vault.manager.CipherManager import com.x8bit.bitwarden.data.vault.manager.CipherManager

View File

@ -18,6 +18,7 @@ import com.bitwarden.exporters.ExportFormat
import com.bitwarden.fido.Fido2CredentialAutofillView import com.bitwarden.fido.Fido2CredentialAutofillView
import com.bitwarden.network.model.SyncResponseJson import com.bitwarden.network.model.SyncResponseJson
import com.bitwarden.network.model.UpdateFolderResponseJson import com.bitwarden.network.model.UpdateFolderResponseJson
import com.bitwarden.network.service.CiphersService
import com.bitwarden.network.service.FolderService import com.bitwarden.network.service.FolderService
import com.bitwarden.network.util.isNoConnectionError import com.bitwarden.network.util.isNoConnectionError
import com.bitwarden.sdk.Fido2CredentialStore import com.bitwarden.sdk.Fido2CredentialStore
@ -52,7 +53,6 @@ import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource
import com.x8bit.bitwarden.data.vault.datasource.network.model.CreateFileSendResponse import com.x8bit.bitwarden.data.vault.datasource.network.model.CreateFileSendResponse
import com.x8bit.bitwarden.data.vault.datasource.network.model.CreateSendJsonResponse import com.x8bit.bitwarden.data.vault.datasource.network.model.CreateSendJsonResponse
import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateSendResponseJson import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateSendResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersService
import com.x8bit.bitwarden.data.vault.datasource.network.service.SendsService import com.x8bit.bitwarden.data.vault.datasource.network.service.SendsService
import com.x8bit.bitwarden.data.vault.datasource.network.service.SyncService import com.x8bit.bitwarden.data.vault.datasource.network.service.SyncService
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource

View File

@ -1,6 +1,7 @@
package com.x8bit.bitwarden.data.vault.repository.di package com.x8bit.bitwarden.data.vault.repository.di
import com.bitwarden.data.manager.DispatcherManager import com.bitwarden.data.manager.DispatcherManager
import com.bitwarden.network.service.CiphersService
import com.bitwarden.network.service.FolderService import com.bitwarden.network.service.FolderService
import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource
import com.x8bit.bitwarden.data.auth.manager.UserLogoutManager import com.x8bit.bitwarden.data.auth.manager.UserLogoutManager
@ -9,7 +10,6 @@ import com.x8bit.bitwarden.data.platform.manager.DatabaseSchemeManager
import com.x8bit.bitwarden.data.platform.manager.PushManager import com.x8bit.bitwarden.data.platform.manager.PushManager
import com.x8bit.bitwarden.data.platform.manager.ReviewPromptManager import com.x8bit.bitwarden.data.platform.manager.ReviewPromptManager
import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersService
import com.x8bit.bitwarden.data.vault.datasource.network.service.SendsService import com.x8bit.bitwarden.data.vault.datasource.network.service.SendsService
import com.x8bit.bitwarden.data.vault.datasource.network.service.SyncService import com.x8bit.bitwarden.data.vault.datasource.network.service.SyncService
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource

View File

@ -9,11 +9,13 @@ import com.bitwarden.network.model.CreateCipherInOrganizationJsonRequest
import com.bitwarden.network.model.ShareCipherJsonRequest import com.bitwarden.network.model.ShareCipherJsonRequest
import com.bitwarden.network.model.SyncResponseJson import com.bitwarden.network.model.SyncResponseJson
import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest
import com.bitwarden.network.model.UpdateCipherResponseJson
import com.bitwarden.network.model.createMockAttachment import com.bitwarden.network.model.createMockAttachment
import com.bitwarden.network.model.createMockAttachmentJsonResponse import com.bitwarden.network.model.createMockAttachmentJsonResponse
import com.bitwarden.network.model.createMockAttachmentResponse import com.bitwarden.network.model.createMockAttachmentResponse
import com.bitwarden.network.model.createMockCipher import com.bitwarden.network.model.createMockCipher
import com.bitwarden.network.model.createMockCipherJsonRequest import com.bitwarden.network.model.createMockCipherJsonRequest
import com.bitwarden.network.service.CiphersService
import com.bitwarden.vault.Attachment import com.bitwarden.vault.Attachment
import com.bitwarden.vault.AttachmentView import com.bitwarden.vault.AttachmentView
import com.bitwarden.vault.Cipher import com.bitwarden.vault.Cipher
@ -24,8 +26,6 @@ import com.x8bit.bitwarden.data.auth.datasource.disk.util.FakeAuthDiskSource
import com.x8bit.bitwarden.data.platform.error.NoActiveUserException import com.x8bit.bitwarden.data.platform.error.NoActiveUserException
import com.x8bit.bitwarden.data.platform.manager.ReviewPromptManager import com.x8bit.bitwarden.data.platform.manager.ReviewPromptManager
import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource
import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateCipherResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersService
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockAttachmentView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockAttachmentView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView

View File

@ -31,6 +31,7 @@ import com.bitwarden.network.model.createMockProfile
import com.bitwarden.network.model.createMockSend import com.bitwarden.network.model.createMockSend
import com.bitwarden.network.model.createMockSendJsonRequest import com.bitwarden.network.model.createMockSendJsonRequest
import com.bitwarden.network.model.createMockSyncResponse import com.bitwarden.network.model.createMockSyncResponse
import com.bitwarden.network.service.CiphersService
import com.bitwarden.network.service.FolderService import com.bitwarden.network.service.FolderService
import com.bitwarden.sdk.Fido2CredentialStore import com.bitwarden.sdk.Fido2CredentialStore
import com.bitwarden.send.SendType import com.bitwarden.send.SendType
@ -63,7 +64,6 @@ import com.x8bit.bitwarden.data.vault.datasource.disk.VaultDiskSource
import com.x8bit.bitwarden.data.vault.datasource.network.model.CreateFileSendResponse import com.x8bit.bitwarden.data.vault.datasource.network.model.CreateFileSendResponse
import com.x8bit.bitwarden.data.vault.datasource.network.model.CreateSendJsonResponse import com.x8bit.bitwarden.data.vault.datasource.network.model.CreateSendJsonResponse
import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateSendResponseJson import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateSendResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.service.CiphersService
import com.x8bit.bitwarden.data.vault.datasource.network.service.SendsService import com.x8bit.bitwarden.data.vault.datasource.network.service.SendsService
import com.x8bit.bitwarden.data.vault.datasource.network.service.SyncService import com.x8bit.bitwarden.data.vault.datasource.network.service.SyncService
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource

View File

@ -0,0 +1,14 @@
package com.bitwarden.network.model
/**
* Information about a cipher attachment to share.
*
* @property id The attachment's ID.
* @property key The attachment's encrypted key value.
* @property fileName The attachment's encrypted file name.
*/
data class AttachmentInfo(
val id: String,
val key: String,
val fileName: String?,
)

View File

@ -1,4 +1,4 @@
package com.x8bit.bitwarden.data.vault.datasource.network.model package com.bitwarden.network.model
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@ -1,6 +1,5 @@
package com.x8bit.bitwarden.data.vault.datasource.network.model package com.bitwarden.network.model
import com.bitwarden.network.model.SyncResponseJson
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@ -1,16 +1,16 @@
package com.x8bit.bitwarden.data.vault.datasource.network.service package com.bitwarden.network.service
import com.bitwarden.network.model.AttachmentInfo
import com.bitwarden.network.model.AttachmentJsonRequest import com.bitwarden.network.model.AttachmentJsonRequest
import com.bitwarden.network.model.AttachmentJsonResponse import com.bitwarden.network.model.AttachmentJsonResponse
import com.bitwarden.network.model.CipherJsonRequest import com.bitwarden.network.model.CipherJsonRequest
import com.bitwarden.network.model.CreateCipherInOrganizationJsonRequest import com.bitwarden.network.model.CreateCipherInOrganizationJsonRequest
import com.bitwarden.network.model.ImportCiphersJsonRequest import com.bitwarden.network.model.ImportCiphersJsonRequest
import com.bitwarden.network.model.ImportCiphersResponseJson
import com.bitwarden.network.model.ShareCipherJsonRequest import com.bitwarden.network.model.ShareCipherJsonRequest
import com.bitwarden.network.model.SyncResponseJson import com.bitwarden.network.model.SyncResponseJson
import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest
import com.bitwarden.vault.Attachment import com.bitwarden.network.model.UpdateCipherResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.model.ImportCiphersResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateCipherResponseJson
import java.io.File import java.io.File
/** /**
@ -67,7 +67,7 @@ interface CiphersService {
*/ */
suspend fun shareAttachment( suspend fun shareAttachment(
cipherId: String, cipherId: String,
attachment: Attachment, attachment: AttachmentInfo,
organizationId: String, organizationId: String,
encryptedFile: File, encryptedFile: File,
): Result<Unit> ): Result<Unit>

View File

@ -1,25 +1,24 @@
package com.x8bit.bitwarden.data.vault.datasource.network.service package com.bitwarden.network.service
import androidx.core.net.toUri import androidx.core.net.toUri
import com.bitwarden.core.data.util.asFailure
import com.bitwarden.network.api.AzureApi import com.bitwarden.network.api.AzureApi
import com.bitwarden.network.api.CiphersApi import com.bitwarden.network.api.CiphersApi
import com.bitwarden.network.model.AttachmentInfo
import com.bitwarden.network.model.AttachmentJsonRequest import com.bitwarden.network.model.AttachmentJsonRequest
import com.bitwarden.network.model.AttachmentJsonResponse import com.bitwarden.network.model.AttachmentJsonResponse
import com.bitwarden.network.model.CipherJsonRequest import com.bitwarden.network.model.CipherJsonRequest
import com.bitwarden.network.model.CreateCipherInOrganizationJsonRequest import com.bitwarden.network.model.CreateCipherInOrganizationJsonRequest
import com.bitwarden.network.model.FileUploadType import com.bitwarden.network.model.FileUploadType
import com.bitwarden.network.model.ImportCiphersJsonRequest import com.bitwarden.network.model.ImportCiphersJsonRequest
import com.bitwarden.network.model.ImportCiphersResponseJson
import com.bitwarden.network.model.ShareCipherJsonRequest import com.bitwarden.network.model.ShareCipherJsonRequest
import com.bitwarden.network.model.SyncResponseJson import com.bitwarden.network.model.SyncResponseJson
import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest
import com.bitwarden.network.model.UpdateCipherResponseJson
import com.bitwarden.network.model.toBitwardenError import com.bitwarden.network.model.toBitwardenError
import com.bitwarden.network.util.NetworkErrorCode import com.bitwarden.network.util.NetworkErrorCode
import com.bitwarden.network.util.parseErrorBodyOrNull import com.bitwarden.network.util.parseErrorBodyOrNull
import com.bitwarden.network.util.toResult import com.bitwarden.network.util.toResult
import com.bitwarden.vault.Attachment
import com.x8bit.bitwarden.data.vault.datasource.network.model.ImportCiphersResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateCipherResponseJson
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.MultipartBody import okhttp3.MultipartBody
@ -127,18 +126,14 @@ class CiphersServiceImpl(
override suspend fun shareAttachment( override suspend fun shareAttachment(
cipherId: String, cipherId: String,
attachment: Attachment, attachment: AttachmentInfo,
organizationId: String, organizationId: String,
encryptedFile: File, encryptedFile: File,
): Result<Unit> { ): Result<Unit> {
val attachmentId = attachment.id
?: return IllegalStateException("Attachment must have ID").asFailure()
val attachmentKey = attachment.key
?: return IllegalStateException("Attachment must have Key").asFailure()
return ciphersApi return ciphersApi
.shareAttachment( .shareAttachment(
cipherId = cipherId, cipherId = cipherId,
attachmentId = attachmentId, attachmentId = attachment.id,
organizationId = organizationId, organizationId = organizationId,
body = this body = this
.createMultipartBodyBuilder( .createMultipartBodyBuilder(
@ -148,7 +143,7 @@ class CiphersServiceImpl(
.addPart( .addPart(
part = MultipartBody.Part.createFormData( part = MultipartBody.Part.createFormData(
name = "key", name = "key",
value = attachmentKey, value = attachment.key,
), ),
) )
.build(), .build(),

View File

@ -0,0 +1,10 @@
package com.bitwarden.network.model
/**
* Creates a mock [AttachmentInfo] with the given [number].
*/
fun createMockAttachmentInfo(number: Int = 1): AttachmentInfo = AttachmentInfo(
id = "mockId-$number",
key = "mockKey-$number",
fileName = "mockFileName-$number",
)

View File

@ -1,4 +1,4 @@
package com.x8bit.bitwarden.data.vault.datasource.network.service package com.bitwarden.network.service
import android.net.Uri import android.net.Uri
import com.bitwarden.network.api.AzureApi import com.bitwarden.network.api.AzureApi
@ -8,17 +8,17 @@ import com.bitwarden.network.model.AttachmentJsonResponse
import com.bitwarden.network.model.CreateCipherInOrganizationJsonRequest import com.bitwarden.network.model.CreateCipherInOrganizationJsonRequest
import com.bitwarden.network.model.FileUploadType import com.bitwarden.network.model.FileUploadType
import com.bitwarden.network.model.ImportCiphersJsonRequest import com.bitwarden.network.model.ImportCiphersJsonRequest
import com.bitwarden.network.model.ImportCiphersResponseJson
import com.bitwarden.network.model.ShareCipherJsonRequest import com.bitwarden.network.model.ShareCipherJsonRequest
import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest import com.bitwarden.network.model.UpdateCipherCollectionsJsonRequest
import com.bitwarden.network.model.UpdateCipherResponseJson
import com.bitwarden.network.model.createMockAttachment import com.bitwarden.network.model.createMockAttachment
import com.bitwarden.network.model.createMockAttachmentInfo
import com.bitwarden.network.model.createMockAttachmentJsonRequest import com.bitwarden.network.model.createMockAttachmentJsonRequest
import com.bitwarden.network.model.createMockAttachmentJsonResponse import com.bitwarden.network.model.createMockAttachmentJsonResponse
import com.bitwarden.network.model.createMockAttachmentResponse import com.bitwarden.network.model.createMockAttachmentResponse
import com.bitwarden.network.model.createMockCipher import com.bitwarden.network.model.createMockCipher
import com.bitwarden.network.model.createMockCipherJsonRequest import com.bitwarden.network.model.createMockCipherJsonRequest
import com.x8bit.bitwarden.data.vault.datasource.network.model.ImportCiphersResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.model.UpdateCipherResponseJson
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkAttachment
import io.mockk.every import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
import io.mockk.mockkStatic import io.mockk.mockkStatic
@ -216,46 +216,12 @@ class CiphersServiceTest : BaseServiceTest() {
assertEquals(Unit, result.getOrThrow()) assertEquals(Unit, result.getOrThrow())
} }
@Test
fun `shareAttachment without attachment ID should return an error`() = runTest {
val cipherId = "cipherId"
val organizationId = "organizationId"
val attachment = createMockSdkAttachment(number = 1).copy(id = null)
val encryptedFile = File.createTempFile("mockFile", "temp")
val result = ciphersService.shareAttachment(
cipherId = cipherId,
attachment = attachment,
organizationId = organizationId,
encryptedFile = encryptedFile,
)
assertTrue(result.isFailure)
}
@Test
fun `shareAttachment without attachment key should return an error`() = runTest {
val cipherId = "cipherId"
val organizationId = "organizationId"
val attachment = createMockSdkAttachment(number = 1, key = null)
val encryptedFile = File.createTempFile("mockFile", "temp")
val result = ciphersService.shareAttachment(
cipherId = cipherId,
attachment = attachment,
organizationId = organizationId,
encryptedFile = encryptedFile,
)
assertTrue(result.isFailure)
}
@Test @Test
fun `shareAttachment should execute the share attachment API`() = runTest { fun `shareAttachment should execute the share attachment API`() = runTest {
server.enqueue(MockResponse().setResponseCode(200)) server.enqueue(MockResponse().setResponseCode(200))
val cipherId = "cipherId" val cipherId = "cipherId"
val organizationId = "organizationId" val organizationId = "organizationId"
val attachment = createMockSdkAttachment(number = 1) val attachment = createMockAttachmentInfo(number = 1)
val encryptedFile = File.createTempFile("mockFile", "temp") val encryptedFile = File.createTempFile("mockFile", "temp")
val result = ciphersService.shareAttachment( val result = ciphersService.shareAttachment(