Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

merge: develop-AN, develop-BE to release-v1.1.0 #449

Merged
merged 96 commits into from
Aug 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
9497289
feat: 게시글 상세 화면 구현 (#8)
Namyunsuk Jul 21, 2024
5267dbd
feat: BottomNavigation 구현 (#16)
chaehyuns Jul 22, 2024
7a08d8b
feat: 홈화면, 마이페이지 화면 레이아웃 작성 (#19)
Namyunsuk Jul 23, 2024
f2403cc
feat: 댓글방 목록 구현 (#26)
songpink Jul 23, 2024
8558dfd
feat: 댓글방 디테일 화면 구현 (#32)
chaehyuns Jul 23, 2024
37cad6c
feat: 공모 상세 페이지 API 연결 (#46)
Namyunsuk Jul 24, 2024
f0e5c19
chore: 안드로이드 CI 파일 작성 (#63)
chaehyuns Jul 24, 2024
b61934c
chore: build CI 작업을 위한 manifest 파일 수정 (#65)
chaehyuns Jul 24, 2024
2b8195d
feat 댓글방 접히는 공지 뷰 구현 (#72)
chaehyuns Jul 24, 2024
71d556d
feat: 홈화면 API 연결 (#74)
Namyunsuk Jul 24, 2024
93a31f8
feat: 댓글방 목록 API 연결 (#82)
songpink Jul 25, 2024
9e9de41
feat: 댓글방 접히는 공지 API 연결 (#85)
chaehyuns Jul 25, 2024
86cbb98
feat: 공모 상세 페이지 기능 추가 (#94)
Namyunsuk Jul 25, 2024
91b102e
feat: 댓글방 댓글 작성 api 연결 (#95)
chaehyuns Jul 25, 2024
9a07ab2
feat: 댓글방 입장 기능, 본인이 총대인 방은 다르게 보이는 기능 구현 (#99)
songpink Jul 25, 2024
7066818
feat: 홈 화면 무한 스크롤 기능 구현 (#109)
Namyunsuk Jul 25, 2024
2e35368
fix: 마지막 댓글 response를 nullable하게 수정 (#115)
songpink Jul 25, 2024
b02c6ca
feat: 댓글방 댓글 조회 api 연결 (#116)
chaehyuns Jul 25, 2024
896e4be
feat: 댓글방 디테일 공동 구매 상태별 관리 (#117)
chaehyuns Jul 26, 2024
40804ba
refactor: 네이밍 수정 (#123)
songpink Jul 29, 2024
0b9e3b1
refactor: 뷰모델 팩토리를 뷰모델의 companion object에서 구현하는 방식으로 변경 (#125)
songpink Jul 30, 2024
7cd98a7
refactor: 뷰모델 팩토리 방식 변경 (#130)
Namyunsuk Jul 30, 2024
b73a293
refactor: Service분리 (#132)
Namyunsuk Jul 30, 2024
0c59f41
feat: 공모글 작성 UI 구현 (#134)
songpink Jul 30, 2024
a36190b
feat: 댓글방 참여자 목록 Drawer Layout UI 구현 (#136)
chaehyuns Jul 30, 2024
adcc62b
feat: 홈화면(공모목록) UI 추가 구현 및 상태 변경 대응 (#142)
Namyunsuk Aug 1, 2024
bdbcf7e
feat: 주소검색 기능구현 (#161)
Namyunsuk Aug 4, 2024
85fdbe2
build: Firebase의존성 추가 (#165)
Namyunsuk Aug 5, 2024
1613a1b
feat: 공모글 작성 API 연결 (#162)
songpink Aug 5, 2024
5bcbee6
feat: 댓글방 디테일 Room을 사용하여 data 저장 (#166)
chaehyuns Aug 5, 2024
46b5293
chore: CI 스크립트 추가 (#173)
Namyunsuk Aug 6, 2024
dcf87c1
feat: 날짜, 시간 선택 기능 구현, 주소검색 기능 연결 (#171)
songpink Aug 6, 2024
85ffd4c
feat: 상품 URL 이미지 추출 API 연결 (#180)
chaehyuns Aug 6, 2024
0e1d530
feat: 공모 목록 조회 API연결 (#201)
Namyunsuk Aug 7, 2024
8594ccf
feat: 바텀 네비게이션 고정 기능 구현 (#211)
Namyunsuk Aug 7, 2024
febe598
feat: 키보드 이외 영역 터치 시 키보드 내려가도록 구현 (#214)
Namyunsuk Aug 7, 2024
20d0acf
feat: 이미지 업로드 및 권한 설정 (#216)
chaehyuns Aug 7, 2024
3b5b4b5
feat: 검색 시 해당 키워드의 색상을 변경하는 기능 구현 (#222)
Namyunsuk Aug 7, 2024
9b8053e
Feature/217 offering status (#230)
chaehyuns Aug 7, 2024
88e54da
feat: 댓글방 상태 변경 (#231)
chaehyuns Aug 7, 2024
05845b0
feature: 카카오 로그인 구현 (#235)
songpink Aug 8, 2024
610eedd
fix: 필터링 오류 수정 (#243)
Namyunsuk Aug 8, 2024
8a20ff3
feat: 공동구매 상태 변경 다이얼로그 구현 (#245)
chaehyuns Aug 8, 2024
e60360b
test: 테스트 코드 작성을 위한 기본 세팅 (#255)
chaehyuns Aug 8, 2024
f540347
feat: 공모글 목록 화면 UI 개선, 공모글 작성에서 낱개 금액이 엔빵 가격보다 저렴할 시 글 작성 막는 기능 구현 (#…
songpink Aug 8, 2024
1c6023d
feat: 홈화면 테스트 작성 (#257)
Namyunsuk Aug 8, 2024
c0455b9
test: 댓글방 테스트 코드 작성 (#258)
chaehyuns Aug 8, 2024
c6b4d09
feat: GA 모니터링 환경 구축 및 로깅 전략 적용 (#242)
chaehyuns Aug 8, 2024
a4ec5de
test: 공모글 작성 이미지 테스트 코드 작성 (#260)
chaehyuns Aug 8, 2024
3f4e35b
feat: 로그인 후 홈화면으로 이동해도 로그인 화면이 종료되지 않는 문제 수정 (#261)
songpink Aug 8, 2024
b5b5c50
feat: 공모 상세 화면 테스트 작성 (#264)
Namyunsuk Aug 8, 2024
0351188
refactor: 홈화면 수정 (#271)
Namyunsuk Aug 9, 2024
22e8541
feat: 공모글 작성 화면 테스트코드 작성 (#274)
songpink Aug 9, 2024
535518f
feat: 댓글방 목록 화면 테스트코드 작성 (#276)
songpink Aug 9, 2024
336d689
fix: 공모 상세 화면 오류 수정 (#280)
Namyunsuk Aug 9, 2024
ff92279
feat: 댓글방 목록 화면 자동 업데이트 되지 않는 문제 수정, 회원가입 이후 자동으로 로그인되지 않는 문제 수정 (#282)
songpink Aug 9, 2024
a989387
chore: change version name (#291)
chaehyuns Aug 9, 2024
d8e503c
feat: 카카오 계정 로그인 기능 구현 시 CI가 실패하는 문제 해결 (#296)
songpink Aug 12, 2024
8d1e3a0
feat: 로그인 화면 리팩토링 (#298)
songpink Aug 12, 2024
8a20afe
refactor: 채팅방 UI UX 개선 (#303)
chaehyuns Aug 12, 2024
03bbff8
feat: 댓글방 목록에서 자신이 총대인 댓글방의 UI 개선 (#304)
songpink Aug 12, 2024
61ed93e
feat: 가로모드, 다크모드 설정 (#305)
chaehyuns Aug 12, 2024
c20464a
refactor: api변경에 따른 리팩토링 (#310)
Namyunsuk Aug 13, 2024
0aaea9e
feat: 로그인 화면 해상도 대응 (#313)
chaehyuns Aug 13, 2024
da44212
feat: 이미지 업로드 중일 때 로딩 상태 설정 (#317)
chaehyuns Aug 13, 2024
61d8be4
refactor: 홈화면 리팩토링 (#324)
Namyunsuk Aug 14, 2024
0a51789
feat: 댓글방 새로운 기능 GA 연결 (#328)
chaehyuns Aug 14, 2024
00004dc
feat: Fragment GA 모니터링 수집 (#332)
chaehyuns Aug 14, 2024
070ca28
feat: 마이페이지 기본 세팅 및 뷰 변경 (#335)
chaehyuns Aug 14, 2024
6dd7ad2
feat: 마이페이지 기능 구현 (#341)
chaehyuns Aug 14, 2024
20781d8
fix: 상세화면에서 홈화면으로 갔을 때 상태 변경 안되는 오류 수정 (#343)
Namyunsuk Aug 16, 2024
3883d8a
refactor: API변경에 따른 대응 (#352)
Namyunsuk Aug 16, 2024
3e56bf9
feat: 공모글 작성 화면 ux 개선 (#344)
songpink Aug 16, 2024
fe9e2e1
feat: 로그인 시에도 memberId와 nickName을 받아서 data store에 저장하는 기능 구현 (#358)
songpink Aug 16, 2024
4f0f999
fix: 필터 오류 수정 (#362)
Namyunsuk Aug 16, 2024
6cdd6fd
feat: API 스펙 변경에 따른 대응 (#364)
chaehyuns Aug 16, 2024
612e815
fix: 공모 작성 후 홈화면 돌아올 때 새로 작성한 글이 보이지 않는 오류 수정 (#369)
Namyunsuk Aug 19, 2024
d45a038
feat: Access Token, Refresh Token을 data store에 저장하는 기능 구현 (#372)
songpink Aug 19, 2024
7514002
feat: 공모 상세 화면 추가 기능 반영 (#375)
Namyunsuk Aug 19, 2024
311f07b
fix: 댓글방 목록의 마지막 댓글방이 보이지 않는 문제 수정 (#376)
songpink Aug 19, 2024
2ab9287
refactor: 홈화면 api필드 추가에 따른 대응 (#381)
Namyunsuk Aug 19, 2024
487c83d
feat: 공모 목록에서 동을 보여주는 기능 구현 (#386)
songpink Aug 19, 2024
faa53c0
refactor: 상태변경 리팩토링 (#389)
Namyunsuk Aug 20, 2024
a8197ff
fix: 댓글 입력 후 뒤로가기 시 최근 댓글이 반영되도록 수정 (#397)
songpink Aug 20, 2024
6be923a
feat: 댓글방 참여자 확인 API 연결 (#401)
chaehyuns Aug 20, 2024
3dc2b6b
feat: 댓글방 공동구매 나가기 API 연결 (#402)
chaehyuns Aug 20, 2024
6e035ba
feat: CallApiHandler 구현 (#403)
songpink Aug 21, 2024
1dc3ce0
feat: proguard를 사용한 난독화 적용 (#413)
chaehyuns Aug 21, 2024
5169fc3
fix: 공구 상세 페이지 오류 해결 (#417)
Namyunsuk Aug 22, 2024
2a750e7
refactor: 공모 목록, 공모 상세 에러 핸들링 (#418)
Namyunsuk Aug 22, 2024
fd9a7bd
feat: 로그인 api 변경 반영 (#426)
songpink Aug 22, 2024
67effd0
refactor: 에러 핸들링 리팩토링 (#436)
Namyunsuk Aug 22, 2024
010e61a
feat: 리프레시 토큰 만료 시 데이터스토어를 비우고 로그인 화면으로 이동하는 기능 구현 (#438)
songpink Aug 22, 2024
e6c0ca8
feat: 댓글방 에러 헨들링 (#439)
chaehyuns Aug 22, 2024
790a614
refactor: refresh시 401이 오는 경우에 대한 에러핸들링 추가 (#441)
Namyunsuk Aug 22, 2024
9796ae0
chore: 버전 업데이트 (#443)
chaehyuns Aug 22, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
108 changes: 108 additions & 0 deletions .github/workflows/android.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
name: Android CI

on:
push:
branches: [ "develop-AN" ]
paths:
- 'android/**'
pull_request:
branches: [ "develop-AN" ]
paths:
- 'android/**'

defaults:
run:
working-directory: ./android

jobs:
ktlint_check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', '**/buildSrc/**/*.kt') }}
restore-keys: |
${{ runner.os }}-gradle-

- name: Create google-services
run: echo "${{ secrets.GOOGLE_SERVICES_JSON }}" > ./app/google-services.json

- name: Create local.properties
env:
BASE_URL: ${{ secrets.BASE_URL }}
TOKEN: ${{ secrets.TOKEN }}
NATIVE_APP_KEY: ${{ secrets.NATIVE_APP_KEY }}
run: |
echo "sdk.dir=/Users/chaehyun/Library/Android/sdk" > ./local.properties
echo "base_url=$BASE_URL" >> ./local.properties
echo "token=$TOKEN" >> ./local.properties
echo "native_app_key=$NATIVE_APP_KEY" >> ./local.properties

- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Ktlint check
run: ./gradlew ktlintCheck

build_and_test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', '**/buildSrc/**/*.kt') }}
restore-keys: |
${{ runner.os }}-gradle-

- name: Create google-services.json
env:
GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }}
run: echo "$GOOGLE_SERVICES_JSON" > app/google-services.json

- name: Create local.properties
env:
BASE_URL: ${{ secrets.BASE_URL }}
TOKEN: ${{ secrets.TOKEN }}
NATIVE_APP_KEY: ${{ secrets.NATIVE_APP_KEY }}
run: |
echo "sdk.dir=/Users/chaehyun/Library/Android/sdk" > ./local.properties
echo "base_url=$BASE_URL" >> ./local.properties
echo "token=$TOKEN" >> ./local.properties
echo "native_app_key=$NATIVE_APP_KEY" >> ./local.properties

- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Gradle Clean check
run: ./gradlew clean

- name: Build with Gradle
run: ./gradlew build

- name: Run Unit Test
run: ./gradlew test
102 changes: 87 additions & 15 deletions android/app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,32 +1,62 @@
import java.io.FileInputStream
import java.util.Properties

plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("de.mannodermaus.android-junit5") version "1.10.0.0"
id("kotlin-kapt")
id("com.google.gms.google-services")
kotlin("plugin.serialization") version "2.0.0"
id("com.google.firebase.crashlytics")
}

android {
namespace = "com.zzang.chongdae"
compileSdk = 34


val properties =
Properties().apply {
try {
load(FileInputStream(rootProject.file("local.properties")))
} catch (e: Exception) {
e.printStackTrace()
}
}

defaultConfig {
applicationId = "com.zzang.chongdae"
minSdk = 26
targetSdk = 34
versionCode = 1
versionName = "1.0"
versionCode = 2
versionName = "1.1.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
testInstrumentationRunnerArguments["runnerBuilder"] = "de.mannodermaus.junit5.AndroidJUnit5Builder"
vectorDrawables {
useSupportLibrary = true
}

val baseUrl = properties.getProperty("base_url")
val token = properties.getProperty("token")
val nativeAppKey = properties.getProperty("native_app_key")

buildConfigField("String", "BASE_URL", "\"$baseUrl\"")
buildConfigField("String", "TOKEN", "\"$token\"")
buildConfigField("String", "NATIVE_APP_KEY", "\"$nativeAppKey\"")
manifestPlaceholders["native_app_key"] = nativeAppKey
}

buildTypes {
debug {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro",
)
}
release {
isMinifyEnabled = false
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro",
Expand All @@ -47,15 +77,17 @@ android {
}
}
buildFeatures {
dataBinding = true
buildConfig = true
}

dataBinding {
enable = true
}
}

dependencies {
val navigationVersion = "2.7.7"
val fragmentVersion = "1.8.1"
implementation("androidx.core:core-ktx:1.10.1")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.10.0")
Expand All @@ -73,30 +105,70 @@ dependencies {
androidTestImplementation("io.kotest:kotest-runner-junit5:5.8.0")
androidTestImplementation("de.mannodermaus.junit5:android-test-core:1.3.0")
androidTestRuntimeOnly("de.mannodermaus.junit5:android-test-runner:1.3.0")

// Testing Navigation
androidTestImplementation("androidx.navigation:navigation-testing:$navigationVersion")

implementation("androidx.room:room-runtime:2.6.1")
kapt("androidx.room:room-compiler:2.6.1")
implementation("androidx.room:room-ktx:2.6.1")
implementation("com.google.code.gson:gson:2.8.8")

implementation("com.github.bumptech.glide:glide:4.12.0")
kapt("com.github.bumptech.glide:compiler:4.12.0")
testImplementation("androidx.arch.core:core-testing:2.1.0")
implementation("com.squareup.okhttp3:mockwebserver:4.12.0")

implementation("com.squareup.retrofit2:retrofit:2.11.0")
implementation("com.squareup.retrofit2:converter-gson:2.11.0")

implementation("androidx.room:room-ktx:2.6.1")

implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")
implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0")

kapt("com.github.bumptech.glide:compiler:4.13.2")

implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0")
implementation("androidx.activity:activity-ktx:1.9.0")
implementation("androidx.fragment:fragment-ktx:1.7.0")
implementation("androidx.core:core-ktx:1.10.1")
implementation(libs.androidx.core.ktx)

// Navigation
implementation("androidx.navigation:navigation-fragment-ktx:$navigationVersion")
implementation("androidx.navigation:navigation-ui-ktx:$navigationVersion")

// UI Test - Fragment Scenario
debugImplementation("androidx.fragment:fragment-testing-manifest:$fragmentVersion")
androidTestImplementation("androidx.fragment:fragment-testing:$fragmentVersion")

// Espresso
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
androidTestImplementation("androidx.test:runner:1.4.0")

// Espresso RecyclerView Actions
androidTestImplementation("androidx.test.espresso:espresso-contrib:3.3.0")

// Pagination
implementation("androidx.paging:paging-runtime-ktx:3.3.0")

// WebView
implementation("androidx.webkit:webkit:1.9.0")

// Firebase
implementation(platform("com.google.firebase:firebase-bom:33.1.2"))
implementation("com.google.firebase:firebase-analytics")

// 카카오 로그인
implementation("com.kakao.sdk:v2-all:2.20.3")

// data store
implementation("androidx.datastore:datastore-preferences:1.0.0")

implementation("com.google.firebase:firebase-crashlytics")

// mockk
testImplementation("io.mockk:mockk:1.13.10")
}
85 changes: 84 additions & 1 deletion android/app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,87 @@

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
#-renamesourcefileattribute SourceFile

# retrofit
-keep class com.squareup.retrofit2.** { *; }
-keep class retrofit2.** { *; }
-keepclassmembers,allowobfuscation class * {
@retrofit2.http.* <methods>;
}
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.google.gson.** { *; }
-keep class kotlinx.serialization.** { *; }
-keep class com.zzang.chongdae.data.remote.dto.* { <fields>; }


# room
-keep class androidx.room.** { *; }
-keep interface androidx.room.** { *; }
-keepclassmembers class * {
@androidx.room.* <fields>;
}

# glide
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public class * extends com.bumptech.glide.module.LibraryGlideModule

-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}

-keep class * extends com.bumptech.glide.GeneratedAppGlideModule { *; }

# firebase
-keep class com.google.firebase.** { *; }
-keep class com.google.android.gms.** { *; }
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-keep public class * extends java.lang.Exception

# kakao login
-keep class com.kakao.sdk.**.model.* { <fields>; }

# R8 full mode strips generic signatures from return types if not kept.
-if interface * { @retrofit2.http.* public *** *(...); }
-keep,allowoptimization,allowshrinking,allowobfuscation class <3>

# paging
-keep class androidx.paging.** { *; }

# datastore
-keep class androidx.datastore.** { *; }
-keepclassmembers class androidx.datastore.** { *; }

# mock
-keep class io.mockk.** { *; }
-dontwarn okhttp3.mockwebserver.**

# webview
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}

-keepclassmembers class com.zzang.chongdae.presentation.view.address.JavascriptInterface{
public *;
}

-keep public class com.zzang.chongdae.presentation.view.address.JavascriptInterface

-keepclassmembers class kotlinx.coroutines.** {
*;
}


-dontwarn org.bouncycastle.jsse.**
-dontwarn org.conscrypt.*
-dontwarn org.openjsse.**

-dontwarn javax.swing.**
-dontwarn java.awt.**
-dontwarn java.lang.instrument.**
-dontwarn java.lang.management.**
-dontwarn org.w3c.dom.bootstrap.DOMImplementationRegistry
-dontwarn reactor.blockhound.**
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.zzang.chongdae

import androidx.fragment.app.testing.FragmentScenario
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.zzang.chongdae.presentation.view.comment.CommentRoomsFragment
import org.junit.Before
import org.junit.Test
import org.junit.jupiter.api.DisplayName
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class CommentRoomsFragmentTest {
private lateinit var scenario: FragmentScenario<CommentRoomsFragment>

@Before
fun setUp() {
scenario = FragmentScenario.launchInContainer(CommentRoomsFragment::class.java)
}

@Test
@DisplayName("댓글방 목록으로 이동하면 채팅이라는 텍스트뷰가 보여야 한다")
fun commentRoomTest1() {
// then
onView(withId(R.id.tv_comment_text)).check(matches(isDisplayed()))
}
}
Loading
Loading