Skip to content

Commit

Permalink
Merge pull request #41 from LookUpGroup27/feature/calendar-optimization
Browse files Browse the repository at this point in the history
feat: Calendar Optimization and IcalRepository Integration
  • Loading branch information
othbcq authored Oct 17, 2024
2 parents 9e5c985 + fcba394 commit cf90432
Show file tree
Hide file tree
Showing 13 changed files with 876 additions and 467 deletions.
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ dependencies {
implementation(libs.material)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.navigation.runtime.ktx)
implementation(libs.androidx.navigation.testing)
implementation(libs.test.core.ktx)

// Jetpack Compose BOM
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
package com.github.lookupgroup27.lookup.ui.calendar

import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performTextInput
import androidx.navigation.compose.ComposeNavigator
import androidx.navigation.testing.TestNavHostController
import com.github.lookupgroup27.lookup.model.calendar.CalendarViewModel
import com.github.lookupgroup27.lookup.model.calendar.MockIcalRepository
import com.github.lookupgroup27.lookup.ui.navigation.NavigationActions
import java.text.SimpleDateFormat
import java.util.*
import kotlinx.coroutines.test.advanceUntilIdle
import kotlinx.coroutines.test.runTest
import net.fortuna.ical4j.model.DateTime
import net.fortuna.ical4j.model.component.VEvent
import net.fortuna.ical4j.model.property.Summary
import org.junit.Before
import org.junit.Rule
import org.junit.Test

class CalendarKtTest {

@get:Rule val composeTestRule = createComposeRule()

private lateinit var calendarViewModel: CalendarViewModel
private lateinit var navigationActions: NavigationActions
private lateinit var navController: TestNavHostController
private val dateFormat = SimpleDateFormat("MMMM yyyy", Locale.getDefault())

@Before
fun setUp() {

val mockIcalData =
"""
BEGIN:VCALENDAR
BEGIN:VEVENT
DTSTART:20251001T120000Z
DTEND:20251001T130000Z
SUMMARY:Test Event
END:VEVENT
END:VCALENDAR
"""
.trimIndent()

val mockIcalRepository = MockIcalRepository(mockIcalData)
calendarViewModel = CalendarViewModel(mockIcalRepository)

val event = VEvent(DateTime("20251001T120000Z"), "Test Event v2")
event.getProperties().add(Summary("Test Event v2"))

composeTestRule.setContent {
EventItem(event = event, onClick = {})
navController = TestNavHostController(LocalContext.current)
navController.navigatorProvider.addNavigator(ComposeNavigator())
navigationActions = NavigationActions(navController)
CalendarScreen(calendarViewModel = calendarViewModel, navigationActions = navigationActions)
}
}

@Test
fun testCalendarHeaderDisplaysCurrentMonth() = runTest {
val currentDate = Calendar.getInstance().time
val formattedMonth = dateFormat.format(currentDate)

composeTestRule.onNodeWithText(formattedMonth).assertIsDisplayed()
}

@Test
fun testPreviousMonthButton() = runTest {
val currentDate = Calendar.getInstance().time
val previousMonthDate =
Calendar.getInstance()
.apply {
time = currentDate
add(Calendar.MONTH, -1)
}
.time
val formattedPreviousMonth = dateFormat.format(previousMonthDate)

composeTestRule.onNodeWithContentDescription("Previous Month").performClick()
composeTestRule.onNodeWithText(formattedPreviousMonth).assertIsDisplayed()
}

@Test
fun testNextMonthButton() = runTest {
val currentDate = Calendar.getInstance().time
val nextMonthDate =
Calendar.getInstance()
.apply {
time = currentDate
add(Calendar.MONTH, 1)
}
.time
val formattedNextMonth = dateFormat.format(nextMonthDate)

composeTestRule.onNodeWithContentDescription("Next Month").performClick()
composeTestRule.onNodeWithText(formattedNextMonth).assertIsDisplayed()
}

@Test
fun testLookUpEventButtonExists() = runTest {
composeTestRule.onNodeWithContentDescription("Look Up Event").assertIsDisplayed()
}

@Test
fun testSearchDialogOpensAndSearchesForEvents() = runTest {
advanceUntilIdle()

composeTestRule.onNodeWithContentDescription("Look Up Event").performClick()
composeTestRule.onNodeWithText("Look Up Event").assertIsDisplayed()

composeTestRule.onNodeWithText("Enter event name").performTextInput("Test Event")
composeTestRule.onNodeWithText("Search").performClick()

composeTestRule.waitForIdle()
composeTestRule.onNodeWithText("Test Event").assertIsDisplayed()
}

@Test
fun testSearchDialogCancelButtonClosesDialog() = runTest {
composeTestRule.onNodeWithContentDescription("Look Up Event").performClick()
composeTestRule.onNodeWithText("Look Up Event").assertIsDisplayed()

composeTestRule.onNodeWithText("Cancel").performClick()
composeTestRule.onNodeWithText("Look Up Event").assertDoesNotExist()
}

@Test
fun testEventItemDisplaysCorrectly() = runTest {
composeTestRule.onNodeWithText("Test Event v2").assertIsDisplayed()
composeTestRule.onNodeWithText("Date: October 1, 2025").assertIsDisplayed()
}

@Test
fun testSelectingDayUpdatesSelectedDate() = runTest {
val calendar = Calendar.getInstance()
val dayToSelect = calendar.get(Calendar.DAY_OF_MONTH) + 1

composeTestRule.onNodeWithText(dayToSelect.toString()).performClick()

composeTestRule.onNodeWithText(dayToSelect.toString()).assertIsDisplayed()
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ import androidx.navigation.compose.navigation
import androidx.navigation.compose.rememberNavController
import com.github.lookupgroup27.lookup.model.calendar.CalendarViewModel
import com.github.lookupgroup27.lookup.ui.authentication.SignInScreen
import com.github.lookupgroup27.lookup.ui.calendar.CalendarScreen
import com.github.lookupgroup27.lookup.ui.map.MapScreen
import com.github.lookupgroup27.lookup.ui.navigation.NavigationActions
import com.github.lookupgroup27.lookup.ui.navigation.Route
import com.github.lookupgroup27.lookup.ui.navigation.Screen
import com.github.lookupgroup27.lookup.ui.overview.CalendarScreen
import com.github.lookupgroup27.lookup.ui.overview.LandingScreen
import com.github.lookupgroup27.lookup.ui.overview.MenuScreen
import com.github.lookupgroup27.lookup.ui.overview.QuizScreen
Expand All @@ -45,7 +45,7 @@ class MainActivity : ComponentActivity() {
fun LookUpApp() {
val navController = rememberNavController()
val navigationActions = NavigationActions(navController)
val calendarViewModel: CalendarViewModel = viewModel()
val calendarViewModel: CalendarViewModel = viewModel(factory = CalendarViewModel.Factory)

NavHost(navController = navController, startDestination = Route.LANDING) {
navigation(
Expand Down
Loading

0 comments on commit cf90432

Please sign in to comment.