Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

69 changes: 0 additions & 69 deletions README.md

This file was deleted.

79 changes: 0 additions & 79 deletions app/build.gradle

This file was deleted.

79 changes: 79 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
alias(libs.plugins.kotlin.kapt)
alias(libs.plugins.hilt.android)
}

android {
namespace = "ir.miare.androidcodechallenge"
compileSdk = 36

defaultConfig {
applicationId = "ir.miare.androidcodechallenge"
minSdk = 24
targetSdk = 36
versionCode = 1
versionName = "1.0"

testInstrumentationRunner = "ir.miare.androidcodechallenge.HiltTestRunner"
}

buildTypes {
getByName("debug") {
applicationIdSuffix = ".beta"
versionNameSuffix = "-beta"
isDebuggable = true
}

getByName("release") {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = "11"
}
buildFeatures {
compose = true
}
}

dependencies {

implementation(project(":feature:home"))
implementation(project(":feature:followedplayers"))
implementation(project(":core:designsystem"))

implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.activity.compose)
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.ui)
implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3)
implementation(libs.androidx.navigation.compose)
implementation(libs.androidx.hilt.navigation.compose)
implementation(libs.hilt.android)
kapt(libs.hilt.android.compiler)

testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.ui.test.junit4)
androidTestImplementation(libs.hilt.android.testing)
kaptAndroidTest(libs.hilt.android.compiler)
debugImplementation(libs.androidx.ui.tooling)
debugImplementation(libs.androidx.ui.test.manifest)
}
109 changes: 109 additions & 0 deletions app/src/androidTest/java/ir/miare/androidcodechallenge/AppTests.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package ir.miare.androidcodechallenge

import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
class AppTests {
@get:Rule
val hiltRule = HiltAndroidRule(this)

@get:Rule
val composeTestRule = createAndroidComposeRule<MainActivity>()

@Before
fun setUp() {
hiltRule.inject()
}

fun delay(mills: Long = 5000) {
composeTestRule.waitForIdle()
Thread.sleep(mills)
}

@Test
fun useAppContext() {
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("ir.miare.androidcodechallenge.beta", appContext.packageName)
}

@Test
fun testAppLaunchesSuccessfully() {
composeTestRule.onNodeWithTag("Splash Screen")
.assertExists()
.assertIsDisplayed()
}


@Test
fun testHomeScreenDisplayedAfterSplash() {
delay()

composeTestRule.onNodeWithContentDescription("TopAppBar Title Image")
.assertExists()
.assertIsDisplayed()
}



@Test
fun testBottomNavigationBarIsDisplayed() {
delay()
composeTestRule.onNodeWithText("Home")
.assertExists()
.assertIsDisplayed()
}

@Test
fun testBottomNavigationDestinations() {
delay()
val destinations = listOf("Followed", "Home")

destinations.forEach { destination ->
composeTestRule.onNodeWithText(destination)
.assertExists()
.assertIsDisplayed()
.performClick()
}
}

@Test
fun testNavigationStateManagement() {
delay()
composeTestRule.onNodeWithText("Home").performClick()
composeTestRule.waitForIdle()

composeTestRule.onNodeWithText("Followed").performClick()
composeTestRule.waitForIdle()
}


@Test
fun testAppPerformance() {
delay()
val startTime = System.currentTimeMillis()
repeat(10) {
composeTestRule.onNodeWithText("Home").performClick()
composeTestRule.waitForIdle()
}

val endTime = System.currentTimeMillis()
val duration = endTime - startTime
assertTrue("App interactions took too long: ${duration}ms", duration < 10000)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ class ExampleInstrumentedTest {
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("ir.miare.androidcodechallenge", appContext.packageName)
assertEquals("ir.miare.androidcodechallenge.beta", appContext.packageName)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ir.miare.androidcodechallenge

import android.app.Application
import android.content.Context
import androidx.test.runner.AndroidJUnitRunner
import dagger.hilt.android.testing.HiltTestApplication
import kotlin.jvm.java

class HiltTestRunner : AndroidJUnitRunner() {
override fun newApplication(cl: ClassLoader?, name: String?, context: Context?): Application {
return super.newApplication(cl, HiltTestApplication::class.java.name, context)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package ir.miare.androidcodechallenge

import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent

@Module
@InstallIn(SingletonComponent::class)
object TestModule {
}
Loading