From a068ae492c48ceb099662ce9c45278e5f069275f Mon Sep 17 00:00:00 2001 From: Mariya Date: Mon, 6 Nov 2023 12:36:50 +0530 Subject: [PATCH] unitest is pending --- app/build.gradle | 7 +- .../data/model/test/ViewModelModule.kt | 29 +++++++ .../data/repository/DatabaseRepository.kt | 4 + .../hpostesting/data/repository/Repository.kt | 1 + .../presentation/dashboard/HomeFragment.kt | 2 +- .../presentation/hemocube/HemoCubeFragment.kt | 2 +- .../testRight/TestRightActivity.kt | 2 +- .../testRight/TestRightExpReference.kt | 2 +- .../testRight/TestRightExpSample.kt | 2 +- .../testRight/TestRightResults.kt | 2 +- .../testRight/TestRightViewModel.kt | 80 ++++++++++--------- .../hpostesting/HemocubeViewModelTest.kt | 60 ++++++++++++++ .../hpostesting/TestRightViewModelTest.kt | 45 +++++++++-- build.gradle | 4 +- 14 files changed, 188 insertions(+), 54 deletions(-) create mode 100644 app/src/main/java/com/example/hpostesting/data/model/test/ViewModelModule.kt create mode 100644 app/src/test/java/com/example/hpostesting/HemocubeViewModelTest.kt diff --git a/app/build.gradle b/app/build.gradle index 55ec74c..9195a22 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -71,15 +71,16 @@ dependencies { implementation 'com.google.android.gms:play-services-location:21.0.1' implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1' implementation 'com.google.android.things:androidthings:1.0' - implementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta10' - implementation("com.google.firebase:firebase-appdistribution-api-ktx:16.0.0-beta10") + implementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta11' + implementation("com.google.firebase:firebase-appdistribution-api-ktx:16.0.0-beta11") // Testing testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' - + testImplementation 'org.mockito:mockito-core:3.12.0' + testImplementation "androidx.arch.core:core-testing:2.2.0" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2" implementation 'com.opencsv:opencsv:4.6' diff --git a/app/src/main/java/com/example/hpostesting/data/model/test/ViewModelModule.kt b/app/src/main/java/com/example/hpostesting/data/model/test/ViewModelModule.kt new file mode 100644 index 0000000..7250b18 --- /dev/null +++ b/app/src/main/java/com/example/hpostesting/data/model/test/ViewModelModule.kt @@ -0,0 +1,29 @@ +package com.example.hpostesting.di + +import android.content.Context +import com.example.hpostesting.data.repository.DatabaseRepository +import com.example.hpostesting.data.dao.UserDao +import com.example.hpostesting.domain.SaveRawData +import com.example.hpostesting.domain.SaveRawDataTest +import com.example.hpostesting.presentation.testRight.TestRightViewModel +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ViewModelComponent +import dagger.hilt.android.qualifiers.ApplicationContext + +@Module +@InstallIn(ViewModelComponent::class) +object ViewModelModule { + + @Provides + fun provideTestRightViewModel( + saveRawData: SaveRawData, + saveRawDataTest: SaveRawDataTest, + databaseRepository: DatabaseRepository, + userDao: UserDao, + context: Context + ): TestRightViewModel { + return TestRightViewModel(saveRawData, saveRawDataTest, databaseRepository, userDao, context) + } +} diff --git a/app/src/main/java/com/example/hpostesting/data/repository/DatabaseRepository.kt b/app/src/main/java/com/example/hpostesting/data/repository/DatabaseRepository.kt index a7a2d8f..8bb712d 100644 --- a/app/src/main/java/com/example/hpostesting/data/repository/DatabaseRepository.kt +++ b/app/src/main/java/com/example/hpostesting/data/repository/DatabaseRepository.kt @@ -138,4 +138,8 @@ class DatabaseRepository : Repository { // Find the DeviceData object with the specified deviceId return allDeviceDataList.find { it.deviceId == deviceId } } + + override fun addTestToDatabase(testDetails: UserData): Any { + TODO("Not yet implemented") + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/data/repository/Repository.kt b/app/src/main/java/com/example/hpostesting/data/repository/Repository.kt index 3419ceb..7a4cc10 100644 --- a/app/src/main/java/com/example/hpostesting/data/repository/Repository.kt +++ b/app/src/main/java/com/example/hpostesting/data/repository/Repository.kt @@ -1,5 +1,6 @@ package com.example.hpostesting.data.repository interface Repository { + abstract fun addTestToDatabase(testDetails: UserData): Any // suspend fun addToDatabase(data: PatientDetails) } \ No newline at end of file diff --git a/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt index 1a6995f..33beb7d 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/dashboard/HomeFragment.kt @@ -40,7 +40,7 @@ import java.util.Locale class HomeFragment : Fragment() { private var _binding: FragmentHomeBinding? = null private val binding get() = _binding!! - private val viewModel: TestRightViewModel by activityViewModels() + private val viewModel: TestRightViewModel by activityViewModels() private val hemoCubeViewModel: HemoCubeViewModel by activityViewModels() private lateinit var rvAdapter: UserListAdapter private var batLevel: Int = 0 // Initialize with a default value, or obtain the actual battery level diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt index ee592d9..75769de 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt @@ -309,7 +309,7 @@ class HemoCubeFragment : Fragment() { } } - private fun handleValidResult(validString: String, fullReadOutput: String) { + fun handleValidResult(validString: String, fullReadOutput: String) { try { val result = validString.split(" ") val deviceLog = resultData diff --git a/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightActivity.kt b/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightActivity.kt index 2a75ac8..9ff7cea 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightActivity.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightActivity.kt @@ -32,7 +32,7 @@ import `in`.sminnovations.hpostesting.databinding.ActivityTestRightBinding class TestRightActivity : AppCompatActivity() { private lateinit var binding: ActivityTestRightBinding - private val viewModel by viewModels() + private val viewModel by viewModels>() private var myMenu: Menu? = null private lateinit var mDriver: UsbSerialDriver diff --git a/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightExpReference.kt b/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightExpReference.kt index a9d0536..92bbe6b 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightExpReference.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightExpReference.kt @@ -25,7 +25,7 @@ import `in`.sminnovations.hpostesting.databinding.FragmentTestRightExpReferenceB @AndroidEntryPoint class TestRightExpReference : Fragment() { private lateinit var binding: FragmentTestRightExpReferenceBinding - private val viewModel: TestRightViewModel by activityViewModels() + private val viewModel: TestRightViewModel by activityViewModels() private val TAG = "TestRightExpReference" override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? diff --git a/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightExpSample.kt b/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightExpSample.kt index 33f79ce..369fb33 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightExpSample.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightExpSample.kt @@ -27,7 +27,7 @@ import `in`.sminnovations.hpostesting.databinding.FragmentTestRightExpSampleBind class TestRightExpSample : Fragment() { private lateinit var binding: FragmentTestRightExpSampleBinding - private val viewModel: TestRightViewModel by activityViewModels() + private val viewModel: TestRightViewModel by activityViewModels() private val TAG = "TestRightExpSample" diff --git a/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightResults.kt b/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightResults.kt index a225428..9bb27e8 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightResults.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightResults.kt @@ -32,7 +32,7 @@ import kotlinx.coroutines.withContext class TestRightResults : Fragment() { private lateinit var binding: FragmentTestRightResultsBinding - private val viewModel: TestRightViewModel by activityViewModels() + private val viewModel: TestRightViewModel by activityViewModels() private lateinit var sharedPreference: SharedPreferences override fun onCreateView( diff --git a/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightViewModel.kt b/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightViewModel.kt index 636f8b3..b6b5266 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightViewModel.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/testRight/TestRightViewModel.kt @@ -2,7 +2,6 @@ package com.example.hpostesting.presentation.testRight import android.content.Context import android.net.Uri -import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -27,6 +26,7 @@ import com.example.hpostesting.domain.TestRightResultCalculation import com.example.hpostesting.util.MyUtils import com.google.firebase.storage.FirebaseStorage import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.scopes.ViewModelScoped import kotlinx.coroutines.launch import kotlinx.coroutines.tasks.await import java.io.File @@ -39,14 +39,16 @@ import kotlin.math.log10 import kotlin.math.pow @HiltViewModel +@ViewModelScoped class TestRightViewModel @Inject constructor( private val saveRawData: SaveRawData, private val saveRawDataTest: SaveRawDataTest, private val repository: DatabaseRepository, private val userDao: UserDao, - context: Context + context: Context? ) : ViewModel() { + var isServiceConnected = false val progressBar = MutableLiveData(false) @@ -55,10 +57,10 @@ class TestRightViewModel @Inject constructor( val fireBaseUpload = MutableLiveData() - val testDetails = DataHolder.selectedTest + var testDetails = DataHolder.selectedTest - private val _networkStatusLiveData = NetworkStatusLiveData(context) - val networkStatusLiveData: LiveData + private val _networkStatusLiveData = context?.let { NetworkStatusLiveData(it) } + val networkStatusLiveData: NetworkStatusLiveData? get() = _networkStatusLiveData val allUserData = userDao.getAll() @@ -440,7 +442,7 @@ class TestRightViewModel @Inject constructor( "yyyy-MM-dd HH:mm:ss", Locale.getDefault() ).format(Calendar.getInstance().time) when (repository.addTestToDatabase(testDetails)) { - is Response.Success -> { + is Response.Success<*> -> { fireBaseUpload.postValue("Success") } @@ -449,43 +451,45 @@ class TestRightViewModel @Inject constructor( } } - fun uploadResultToDatabase(context: Context, isOnline: Boolean,deviceSerialNumber: String) = viewModelScope.launch { - val csvFilePath = MyUtils.getAppFolderPath(context) + getCSVFileName() - val logTxtFilePath = MyUtils.getAppFolderPath(context) + getLogFileName() - testDetails?.csvPath = csvFilePath - testDetails?.reportPath = logTxtFilePath - testDetails?.deviceSerialNumber = deviceSerialNumber - if (isOnline) { - val storageRef = FirebaseStorage.getInstance().reference - val storageTestDetailsRef = storageRef.child("${testDetails?._id}/") + fun uploadResultToDatabase(context: Context, isOnline: Boolean, deviceSerialNumber: String) = + viewModelScope.launch { + val csvFilePath = MyUtils.getAppFolderPath(context) + getCSVFileName() + val logTxtFilePath = MyUtils.getAppFolderPath(context) + getLogFileName() + testDetails?.csvPath = csvFilePath + testDetails?.reportPath = logTxtFilePath + testDetails?.deviceSerialNumber = deviceSerialNumber + if (isOnline) { + val storageRef = FirebaseStorage.getInstance().reference + val storageTestDetailsRef = storageRef.child("${testDetails?._id}/") - try { - val csvFileUri = Uri.fromFile(File(csvFilePath)) - val logTxtFileUri = Uri.fromFile(File(logTxtFilePath)) + try { + val csvFileUri = Uri.fromFile(File(csvFilePath)) + val logTxtFileUri = Uri.fromFile(File(logTxtFilePath)) - val csvUploadTask = - storageTestDetailsRef.child(csvFileUri.lastPathSegment!!).putFile(csvFileUri) - .await() - val logUploadTask = storageTestDetailsRef.child(logTxtFileUri.lastPathSegment!!) - .putFile(logTxtFileUri).await() + val csvUploadTask = + storageTestDetailsRef.child(csvFileUri.lastPathSegment!!) + .putFile(csvFileUri) + .await() + val logUploadTask = storageTestDetailsRef.child(logTxtFileUri.lastPathSegment!!) + .putFile(logTxtFileUri).await() - val csvUri = csvUploadTask.storage.downloadUrl.await().toString() - val logUri = logUploadTask.storage.downloadUrl.await().toString() - val serialNumber = Constants.STATICID.firstOrNull { it == deviceSerialNumber } - testDetails?.csvPath = csvUri - testDetails?.reportPath = logUri + val csvUri = csvUploadTask.storage.downloadUrl.await().toString() + val logUri = logUploadTask.storage.downloadUrl.await().toString() + val serialNumber = Constants.STATICID.firstOrNull { it == deviceSerialNumber } + testDetails?.csvPath = csvUri + testDetails?.reportPath = logUri - addResultTestToDb() - } catch (exception: Exception) { - // Handle the exception appropriately (e.g., log the error, display an error message) + addResultTestToDb() + } catch (exception: Exception) { + // Handle the exception appropriately (e.g., log the error, display an error message) + } + } else { + testDetails?.testTime = SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss", Locale.getDefault() + ).format(Calendar.getInstance().time) + userDao.insertAll(testDetails!!) } - } else { - testDetails?.testTime = SimpleDateFormat( - "yyyy-MM-dd HH:mm:ss", Locale.getDefault() - ).format(Calendar.getInstance().time) - userDao.insertAll(testDetails!!) } - } fun bulkUploadResultToDatabase(userData: UserData) = viewModelScope.launch { val storageRef = FirebaseStorage.getInstance().reference @@ -520,7 +524,7 @@ class TestRightViewModel @Inject constructor( "yyyy-MM-dd HH:mm:ss", Locale.getDefault() ).format(Calendar.getInstance().time) when (repository.addTestToDatabase(userData)) { - is Response.Success -> { + is Response.Success<*> -> { fireBaseUpload.postValue("Success") } diff --git a/app/src/test/java/com/example/hpostesting/HemocubeViewModelTest.kt b/app/src/test/java/com/example/hpostesting/HemocubeViewModelTest.kt new file mode 100644 index 0000000..1a3d2e2 --- /dev/null +++ b/app/src/test/java/com/example/hpostesting/HemocubeViewModelTest.kt @@ -0,0 +1,60 @@ +package com.example.hpostesting + +import android.content.SharedPreferences +import android.view.View +import com.example.hpostesting.presentation.hemocube.HemoCubeFragment +import com.example.hpostesting.presentation.hemocube.HemoCubeViewModel +import com.example.hpostesting.presentation.hemocube.HemocubeActivity +import `in`.sminnovations.hpostesting.databinding.FragmentHemoCubeReferenceBinding +import org.junit.Before +import org.junit.Test +import org.mockito.ArgumentMatchers.any +import org.mockito.ArgumentMatchers.anyString +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` +import org.mockito.MockitoAnnotations + +class HemocubeViewModelTest { + @Mock + private lateinit var mockSharedPreferences: SharedPreferences + + @Mock + private lateinit var mockActivity: HemocubeActivity // Replace with your actual Activity class + + @Mock + private lateinit var mockBinding: FragmentHemoCubeReferenceBinding // Replace with your actual Binding class + + private lateinit var hemoCubeFragment: HemoCubeFragment + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + hemoCubeFragment = HemoCubeFragment() + } + + @Test + fun `handleValidResult with valid input`() { + // Arrange + val validString = "valid string" + val fullReadOutput = "full read output" + `when`(mockSharedPreferences.getString(anyString(), anyString())).thenReturn("dummy_value") + `when`(mockActivity.runOnUiThread(any())).thenAnswer { + val runnable = it.getArgument(0, Runnable::class.java) + runnable.run() + } + + // Act + hemoCubeFragment.handleValidResult(validString, fullReadOutput) + + // Assert + // Add appropriate assertions based on the behavior you expect + verify(mockSharedPreferences).edit() + verify(mockBinding).btnSubmit.visibility = View.VISIBLE + verify(mockBinding).btnSubmit.isEnabled = true + // Add more verifications as needed + } + + + // Add more test cases for different scenarios if needed +} \ No newline at end of file diff --git a/app/src/test/java/com/example/hpostesting/TestRightViewModelTest.kt b/app/src/test/java/com/example/hpostesting/TestRightViewModelTest.kt index 72ec827..e99c834 100644 --- a/app/src/test/java/com/example/hpostesting/TestRightViewModelTest.kt +++ b/app/src/test/java/com/example/hpostesting/TestRightViewModelTest.kt @@ -1,17 +1,49 @@ package com.example.hpostesting +import android.content.Context import com.example.hpostesting.data.DataHolder import com.example.hpostesting.data.constant.Constants -import com.example.hpostesting.data.model.PatientData -import com.example.hpostesting.data.model.test.TestRightResultType +import com.example.hpostesting.data.dao.UserDao +import com.example.hpostesting.data.model.patient.UserData +import com.example.hpostesting.data.repository.DatabaseRepository +import com.example.hpostesting.domain.SaveRawData +import com.example.hpostesting.domain.SaveRawDataTest import com.example.hpostesting.presentation.testRight.TestRightViewModel import junit.framework.Assert.assertEquals +import org.junit.Before import org.junit.Test +import org.mockito.Mock +import org.mockito.MockitoAnnotations import java.math.RoundingMode import java.text.DecimalFormat class TestRightViewModelTest { - private val viewModel = TestRightViewModel() + + @Mock + lateinit var mockContext: Context + + @Mock + lateinit var mockRepository: DatabaseRepository + + @Mock + lateinit var mockSaveRawData: SaveRawData + + @Mock + lateinit var mockSaveRawDataTest: SaveRawDataTest + + @Mock + lateinit var mockUserDao: UserDao + + lateinit var viewModel: TestRightViewModel + + @Before + fun setUp() { + // Initialize mocks + MockitoAnnotations.initMocks(this) + + // Create the ViewModel with mock dependencies + viewModel = TestRightViewModel(mockSaveRawData,mockSaveRawDataTest,mockRepository,mockUserDao,mockContext) + } private val data = InputData() @Test @@ -63,8 +95,11 @@ class TestRightViewModelTest { viewModel.mapDeviceConstants(data.inputRead) viewModel.mapPixelNumberToWavelength() viewModel.mapIntensityValues(TestDataGenerator().getInputReferenceMapIntensityValues(), true) - viewModel.mapIntensityValues(TestDataGenerator().getInputSampleMapIntensityValues(), false) - viewModel.patientDetails = PatientData("Surya", 2, "Male", TestRightResultType.UNDEFINED) + val mapIntensityValues = viewModel.mapIntensityValues( + TestDataGenerator().getInputSampleMapIntensityValues(), + false + ) + viewModel.testDetails = UserData("Surya", "2", "Male") viewModel.mapWavelengthToAbsorbance() val wavelengthList = TestDataGenerator().getOutputMapPixelNumberToWavelength() diff --git a/build.gradle b/build.gradle index a4b7f88..1bd6789 100644 --- a/build.gradle +++ b/build.gradle @@ -4,8 +4,8 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:8.0.2' - classpath 'com.google.gms:google-services:4.3.15' - classpath 'com.google.firebase:firebase-appdistribution-gradle:4.0.0' + classpath 'com.google.gms:google-services:4.4.0' + classpath 'com.google.firebase:firebase-appdistribution-gradle:4.0.1' } repositories { mavenCentral()