From 10cad150a4156971163ff492cb9815e37740df90 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Wed, 27 Mar 2024 18:07:39 +0100 Subject: [PATCH 01/32] feat: initialized the association view model --- .../se/assocify/model/associations/AssociationViewModel.kt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt new file mode 100644 index 000000000..2e4a1f98f --- /dev/null +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -0,0 +1,6 @@ +package com.github.se.assocify.model.associations + +import androidx.lifecycle.ViewModel + +class AssociationViewModel: ViewModel() { +} \ No newline at end of file From b510721e4946cfb86b1bbd99c965882b1ac6d397 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Thu, 28 Mar 2024 11:25:40 +0100 Subject: [PATCH 02/32] feat: added some initial useful functions --- .../associations/AssociationViewModel.kt | 27 ++++++++++++++++++- .../se/assocify/model/entities/Association.kt | 13 +++++++++ .../se/assocify/model/entities/Event.kt | 10 +++++++ .../github/se/assocify/model/entities/Role.kt | 5 ++++ .../github/se/assocify/model/entities/User.kt | 5 ++++ 5 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/github/se/assocify/model/entities/Association.kt create mode 100644 app/src/main/java/com/github/se/assocify/model/entities/Event.kt create mode 100644 app/src/main/java/com/github/se/assocify/model/entities/Role.kt create mode 100644 app/src/main/java/com/github/se/assocify/model/entities/User.kt diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index 2e4a1f98f..f21ce0a27 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -1,6 +1,31 @@ package com.github.se.assocify.model.associations import androidx.lifecycle.ViewModel +import com.github.se.assocify.model.entities.Association +import com.github.se.assocify.model.entities.User +import kotlinx.coroutines.flow.MutableStateFlow + +class AssociationViewModel(private var user: User, rivate var assocId: String): ViewModel() { + val _associationState: MutableStateFlow = MutableStateFlow(null) + + + + fun getPendingUsers(): List { + //TODO: modify the value of the notification + return emptyList() + } + + fun getRecordedUsers(): List { + //TODO: modify the value of the list + return emptyList() + } + + fun getAssociationName(): String { + if (_associationState.value == null) return "" + return _associationState.value!!.name + } + + + -class AssociationViewModel: ViewModel() { } \ No newline at end of file diff --git a/app/src/main/java/com/github/se/assocify/model/entities/Association.kt b/app/src/main/java/com/github/se/assocify/model/entities/Association.kt new file mode 100644 index 000000000..457c12a78 --- /dev/null +++ b/app/src/main/java/com/github/se/assocify/model/entities/Association.kt @@ -0,0 +1,13 @@ +package com.github.se.assocify.model.entities + +data class Association( + var uid: String, + val name: String, + val description: String, + val creationDate: String, + val status: String, + val members: List, + val events: List +) { + constructor() : this("", "", "", "", "", listOf(), listOf()) +} \ No newline at end of file diff --git a/app/src/main/java/com/github/se/assocify/model/entities/Event.kt b/app/src/main/java/com/github/se/assocify/model/entities/Event.kt new file mode 100644 index 000000000..21a3499b7 --- /dev/null +++ b/app/src/main/java/com/github/se/assocify/model/entities/Event.kt @@ -0,0 +1,10 @@ +package com.github.se.assocify.model.entities + +data class Event( + val startDate: String, + val endDate: String, + val organizers: List, + val staffers: List +) { + constructor() : this("", "", listOf(), listOf()) +} \ No newline at end of file diff --git a/app/src/main/java/com/github/se/assocify/model/entities/Role.kt b/app/src/main/java/com/github/se/assocify/model/entities/Role.kt new file mode 100644 index 000000000..1a40c2414 --- /dev/null +++ b/app/src/main/java/com/github/se/assocify/model/entities/Role.kt @@ -0,0 +1,5 @@ +package com.github.se.assocify.model.entities + +data class Role(val name: String) { + constructor() : this("") +} \ No newline at end of file diff --git a/app/src/main/java/com/github/se/assocify/model/entities/User.kt b/app/src/main/java/com/github/se/assocify/model/entities/User.kt new file mode 100644 index 000000000..4d35f7609 --- /dev/null +++ b/app/src/main/java/com/github/se/assocify/model/entities/User.kt @@ -0,0 +1,5 @@ +package com.github.se.assocify.model.entities + +data class User(val uid: String, val name: String, val role: Role) { + constructor() : this("", "", Role("")) +} \ No newline at end of file From 5e3f2e818d32d6da5c5118f4fb3f076899cb9c54 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Thu, 28 Mar 2024 11:57:41 +0100 Subject: [PATCH 03/32] feat: wrote the getter functions --- .../associations/AssociationViewModel.kt | 26 ++++++++++++------- .../se/assocify/model/entities/Association.kt | 4 +-- .../github/se/assocify/model/entities/Role.kt | 9 +++++-- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index f21ce0a27..48cf10436 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -2,22 +2,26 @@ package com.github.se.assocify.model.associations import androidx.lifecycle.ViewModel import com.github.se.assocify.model.entities.Association +import com.github.se.assocify.model.entities.Role import com.github.se.assocify.model.entities.User import kotlinx.coroutines.flow.MutableStateFlow -class AssociationViewModel(private var user: User, rivate var assocId: String): ViewModel() { +class AssociationViewModel(private var user: User, private var assocId: String): ViewModel() { val _associationState: MutableStateFlow = MutableStateFlow(null) - fun getPendingUsers(): List { - //TODO: modify the value of the notification - return emptyList() + if(_associationState.value == null){ + return emptyList() + } + return _associationState.value!!.members.filter { x -> x.role == Role.PENDING_MEMBER } } fun getRecordedUsers(): List { - //TODO: modify the value of the list - return emptyList() + if(_associationState.value == null){ + return emptyList() + } + return _associationState.value!!.members.filter { x -> x.role != Role.PENDING_MEMBER } } fun getAssociationName(): String { @@ -25,7 +29,9 @@ class AssociationViewModel(private var user: User, rivate var assocId: String): return _associationState.value!!.name } - - - -} \ No newline at end of file + fun addMember() { + if (user.role != Role.MEMBER && user.role != Role.PENDING_MEMBER) { + /*TODO: use the database to add the value to the db*/ + } + } +} diff --git a/app/src/main/java/com/github/se/assocify/model/entities/Association.kt b/app/src/main/java/com/github/se/assocify/model/entities/Association.kt index 457c12a78..0aa5c2b23 100644 --- a/app/src/main/java/com/github/se/assocify/model/entities/Association.kt +++ b/app/src/main/java/com/github/se/assocify/model/entities/Association.kt @@ -8,6 +8,4 @@ data class Association( val status: String, val members: List, val events: List -) { - constructor() : this("", "", "", "", "", listOf(), listOf()) -} \ No newline at end of file +) \ No newline at end of file diff --git a/app/src/main/java/com/github/se/assocify/model/entities/Role.kt b/app/src/main/java/com/github/se/assocify/model/entities/Role.kt index 1a40c2414..82849ae2f 100644 --- a/app/src/main/java/com/github/se/assocify/model/entities/Role.kt +++ b/app/src/main/java/com/github/se/assocify/model/entities/Role.kt @@ -1,5 +1,10 @@ package com.github.se.assocify.model.entities -data class Role(val name: String) { - constructor() : this("") +enum class Role{ + PRESIDENT, + CO_PRESIDENT, + TREASURER, + COMITEE, + MEMBER, + PENDING_MEMBER } \ No newline at end of file From ccff5d52300aec03c33706d3e4838b027bd6d075 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Thu, 28 Mar 2024 13:43:16 +0100 Subject: [PATCH 04/32] feat: implemented getAssociationDescription, getAssociationDate and getEvents --- .../associations/AssociationViewModel.kt | 22 ++++++++++++++++++- .../github/se/assocify/model/entities/User.kt | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index 48cf10436..bfce82347 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -1,15 +1,19 @@ package com.github.se.assocify.model.associations import androidx.lifecycle.ViewModel +import com.github.se.assocify.model.database.FirebaseApi import com.github.se.assocify.model.entities.Association +import com.github.se.assocify.model.entities.Event import com.github.se.assocify.model.entities.Role import com.github.se.assocify.model.entities.User +import com.google.firebase.Firebase +import com.google.firebase.firestore.firestore import kotlinx.coroutines.flow.MutableStateFlow +import java.time.LocalDate class AssociationViewModel(private var user: User, private var assocId: String): ViewModel() { val _associationState: MutableStateFlow = MutableStateFlow(null) - fun getPendingUsers(): List { if(_associationState.value == null){ return emptyList() @@ -29,9 +33,25 @@ class AssociationViewModel(private var user: User, private var assocId: String): return _associationState.value!!.name } + fun getAssociationDescription(): String{ + if (_associationState.value == null) return "" + return _associationState.value!!.description + } + + fun getCreationDate(): String { + if (_associationState.value == null) return "" + return _associationState.value!!.creationDate + } + fun getEvents(): List { + if (_associationState.value == null) return emptyList() + return _associationState.value!!.events + } + fun addMember() { if (user.role != Role.MEMBER && user.role != Role.PENDING_MEMBER) { /*TODO: use the database to add the value to the db*/ } } + + } diff --git a/app/src/main/java/com/github/se/assocify/model/entities/User.kt b/app/src/main/java/com/github/se/assocify/model/entities/User.kt index 4d35f7609..56f3bc361 100644 --- a/app/src/main/java/com/github/se/assocify/model/entities/User.kt +++ b/app/src/main/java/com/github/se/assocify/model/entities/User.kt @@ -1,5 +1,5 @@ package com.github.se.assocify.model.entities data class User(val uid: String, val name: String, val role: Role) { - constructor() : this("", "", Role("")) + constructor() : this("", "", Role.PENDING_MEMBER) } \ No newline at end of file From 5aacd8c41318b52013ae56c16315627b7399782c Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Sat, 6 Apr 2024 17:32:41 +0200 Subject: [PATCH 05/32] feat: added the update method and the initialization --- .../associations/AssociationViewModel.kt | 79 ++++++++++--------- .../github/se/assocify/model/entities/Role.kt | 16 ++-- .../github/se/assocify/model/entities/User.kt | 4 +- 3 files changed, 50 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index bfce82347..bd0409acb 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -1,7 +1,7 @@ package com.github.se.assocify.model.associations import androidx.lifecycle.ViewModel -import com.github.se.assocify.model.database.FirebaseApi +import com.github.se.assocify.model.database.AssociationAPI import com.github.se.assocify.model.entities.Association import com.github.se.assocify.model.entities.Event import com.github.se.assocify.model.entities.Role @@ -9,49 +9,50 @@ import com.github.se.assocify.model.entities.User import com.google.firebase.Firebase import com.google.firebase.firestore.firestore import kotlinx.coroutines.flow.MutableStateFlow -import java.time.LocalDate -class AssociationViewModel(private var user: User, private var assocId: String): ViewModel() { - val _associationState: MutableStateFlow = MutableStateFlow(null) +class AssociationViewModel(private var user: User, private var assocId: String) : ViewModel() { + val _associationState: MutableStateFlow = MutableStateFlow(null) + private val associationDatabase = AssociationAPI(Firebase.firestore) - fun getPendingUsers(): List { - if(_associationState.value == null){ - return emptyList() - } - return _associationState.value!!.members.filter { x -> x.role == Role.PENDING_MEMBER } - } + init { + updateAssoc() + } - fun getRecordedUsers(): List { - if(_associationState.value == null){ - return emptyList() - } - return _associationState.value!!.members.filter { x -> x.role != Role.PENDING_MEMBER } - } + private fun updateAssoc() { + _associationState.value = associationDatabase.getAssociation(assocId) + } - fun getAssociationName(): String { - if (_associationState.value == null) return "" - return _associationState.value!!.name + fun getPendingUsers(): List { + if (_associationState.value == null) { + return emptyList() } + return _associationState.value!!.members.filter { x -> x.role == Role.PENDING_MEMBER } + } - fun getAssociationDescription(): String{ - if (_associationState.value == null) return "" - return _associationState.value!!.description - } - - fun getCreationDate(): String { - if (_associationState.value == null) return "" - return _associationState.value!!.creationDate - } - fun getEvents(): List { - if (_associationState.value == null) return emptyList() - return _associationState.value!!.events + fun getRecordedUsers(): List { + if (_associationState.value == null) { + return emptyList() } - - fun addMember() { - if (user.role != Role.MEMBER && user.role != Role.PENDING_MEMBER) { - /*TODO: use the database to add the value to the db*/ - } - } - - + return _associationState.value!!.members.filter { x -> x.role != Role.PENDING_MEMBER } + } + + fun getAssociationName(): String { + if (_associationState.value == null) return "" + return _associationState.value!!.name + } + + fun getAssociationDescription(): String { + if (_associationState.value == null) return "" + return _associationState.value!!.description + } + + fun getCreationDate(): String { + if (_associationState.value == null) return "" + return _associationState.value!!.creationDate + } + + fun getEvents(): List { + if (_associationState.value == null) return emptyList() + return _associationState.value!!.events + } } diff --git a/app/src/main/java/com/github/se/assocify/model/entities/Role.kt b/app/src/main/java/com/github/se/assocify/model/entities/Role.kt index 82849ae2f..f415ae447 100644 --- a/app/src/main/java/com/github/se/assocify/model/entities/Role.kt +++ b/app/src/main/java/com/github/se/assocify/model/entities/Role.kt @@ -1,10 +1,10 @@ package com.github.se.assocify.model.entities -enum class Role{ - PRESIDENT, - CO_PRESIDENT, - TREASURER, - COMITEE, - MEMBER, - PENDING_MEMBER -} \ No newline at end of file +enum class Role { + PRESIDENT, + CO_PRESIDENT, + TREASURER, + COMITEE, + MEMBER, + PENDING_MEMBER +} diff --git a/app/src/main/java/com/github/se/assocify/model/entities/User.kt b/app/src/main/java/com/github/se/assocify/model/entities/User.kt index 56f3bc361..9ae11bd21 100644 --- a/app/src/main/java/com/github/se/assocify/model/entities/User.kt +++ b/app/src/main/java/com/github/se/assocify/model/entities/User.kt @@ -1,5 +1,5 @@ package com.github.se.assocify.model.entities data class User(val uid: String, val name: String, val role: Role) { - constructor() : this("", "", Role.PENDING_MEMBER) -} \ No newline at end of file + constructor() : this("", "", Role.PENDING_MEMBER) +} From db9b314ec9844258b7d3bf50669a5037afc8e194 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Sat, 6 Apr 2024 21:55:21 +0200 Subject: [PATCH 06/32] feat: added the function to accept a new user --- .../associations/AssociationViewModel.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index bd0409acb..d686f7f56 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -55,4 +55,24 @@ class AssociationViewModel(private var user: User, private var assocId: String) if (_associationState.value == null) return emptyList() return _associationState.value!!.events } + + fun acceptUser(uid: String) { + if (_associationState.value != null && (user.role == Role.CO_PRESIDENT + || user.role == Role.PRESIDENT) + ) { + val userList = getPendingUsers().filter { u -> u.uid == uid } + if (userList.isEmpty()) return + val user = userList[0] + val updatedUser = User(uid, user.name, Role.MEMBER) + val ass = _associationState.value!! + val updatedAssoc = Association(ass.uid, + ass.name, + ass.description, + ass.creationDate, + ass.status, + ass.members.filter { us -> us.uid != uid } + updatedUser, + ass.events) + associationDatabase.addAssociation(updatedAssoc) + } + } } From 6c6dab245aba641136333a838695b56ec252d94b Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Sat, 6 Apr 2024 22:35:21 +0200 Subject: [PATCH 07/32] fix: corrected the format which was wrong --- .../associations/AssociationViewModel.kt | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index d686f7f56..0aa2da866 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -57,21 +57,22 @@ class AssociationViewModel(private var user: User, private var assocId: String) } fun acceptUser(uid: String) { - if (_associationState.value != null && (user.role == Role.CO_PRESIDENT - || user.role == Role.PRESIDENT) - ) { + if (_associationState.value != null && + (user.role == Role.CO_PRESIDENT || user.role == Role.PRESIDENT)) { val userList = getPendingUsers().filter { u -> u.uid == uid } if (userList.isEmpty()) return val user = userList[0] val updatedUser = User(uid, user.name, Role.MEMBER) val ass = _associationState.value!! - val updatedAssoc = Association(ass.uid, - ass.name, - ass.description, - ass.creationDate, - ass.status, - ass.members.filter { us -> us.uid != uid } + updatedUser, - ass.events) + val updatedAssoc = + Association( + ass.uid, + ass.name, + ass.description, + ass.creationDate, + ass.status, + ass.members.filter { us -> us.uid != uid } + updatedUser, + ass.events) associationDatabase.addAssociation(updatedAssoc) } } From 99db658553b7ff21932ed25ad2ead647e4430007 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Sat, 6 Apr 2024 23:18:55 +0200 Subject: [PATCH 08/32] feat: added the association request --- .../associations/AssociationViewModel.kt | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index 0aa2da866..06094b84d 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -36,6 +36,13 @@ class AssociationViewModel(private var user: User, private var assocId: String) return _associationState.value!!.members.filter { x -> x.role != Role.PENDING_MEMBER } } + fun getAllUsers(): List{ + if (_associationState.value == null) { + return emptyList() + } + return _associationState.value!!.members + } + fun getAssociationName(): String { if (_associationState.value == null) return "" return _associationState.value!!.name @@ -56,7 +63,7 @@ class AssociationViewModel(private var user: User, private var assocId: String) return _associationState.value!!.events } - fun acceptUser(uid: String) { + fun acceptNewUser(uid: String) { if (_associationState.value != null && (user.role == Role.CO_PRESIDENT || user.role == Role.PRESIDENT)) { val userList = getPendingUsers().filter { u -> u.uid == uid } @@ -76,4 +83,18 @@ class AssociationViewModel(private var user: User, private var assocId: String) associationDatabase.addAssociation(updatedAssoc) } } + + fun requestAssociationAccess(){ + val ass = _associationState.value!! + val updatedAssoc = + Association( + ass.uid, + ass.name, + ass.description, + ass.creationDate, + ass.status, + ass.members + user, + ass.events) + associationDatabase.addAssociation(updatedAssoc) + } } From 9427e934fc70b1c5417cf9bf3682d2e924a0d5c8 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Sun, 7 Apr 2024 13:46:43 +0200 Subject: [PATCH 09/32] feat: added the create association function --- .../se/assocify/AssociationViewModelTest.kt | 4 ++++ .../associations/AssociationViewModel.kt | 19 +++++++++++++++++-- .../assocify/model/database/AssociationAPI.kt | 2 ++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt new file mode 100644 index 000000000..b7be0022d --- /dev/null +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt @@ -0,0 +1,4 @@ +package com.github.se.assocify + +class AssociationViewModelTest { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index 06094b84d..1b0f34a70 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -15,10 +15,10 @@ class AssociationViewModel(private var user: User, private var assocId: String) private val associationDatabase = AssociationAPI(Firebase.firestore) init { - updateAssoc() + update() } - private fun updateAssoc() { + fun update() { _associationState.value = associationDatabase.getAssociation(assocId) } @@ -97,4 +97,19 @@ class AssociationViewModel(private var user: User, private var assocId: String) ass.events) associationDatabase.addAssociation(updatedAssoc) } + + + fun createNewAssoc(name: String, description: String, creationDate: String, status: String, members: List, events: List){ + val uid = associationDatabase.getNewId() + val assoc = Association( + uid, + name, + description, + creationDate, + status, + members, + events + ) + associationDatabase.addAssociation(assoc) + } } diff --git a/app/src/main/java/com/github/se/assocify/model/database/AssociationAPI.kt b/app/src/main/java/com/github/se/assocify/model/database/AssociationAPI.kt index 1ca431dc9..741292aa1 100644 --- a/app/src/main/java/com/github/se/assocify/model/database/AssociationAPI.kt +++ b/app/src/main/java/com/github/se/assocify/model/database/AssociationAPI.kt @@ -65,4 +65,6 @@ class AssociationAPI(db: FirebaseFirestore) : FirebaseApi(db) { * @param id the id of the association to delete */ fun deleteAssociation(id: String) = Tasks.await(delete(id)) + + } From 900b35f38d7a69367ff3e9b9e5e5cce4f4f4db2f Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Sun, 7 Apr 2024 14:01:41 +0200 Subject: [PATCH 10/32] fix: reverted to previous role implementation to avoid problems --- .../model/associations/AssociationViewModel.kt | 12 ++++++------ .../com/github/se/assocify/model/entities/Role.kt | 12 +++++------- .../com/github/se/assocify/model/entities/User.kt | 2 +- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index 1b0f34a70..04647b3a2 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -26,14 +26,14 @@ class AssociationViewModel(private var user: User, private var assocId: String) if (_associationState.value == null) { return emptyList() } - return _associationState.value!!.members.filter { x -> x.role == Role.PENDING_MEMBER } + return _associationState.value!!.members.filter { x -> x.role == Role("pending") } } fun getRecordedUsers(): List { if (_associationState.value == null) { return emptyList() } - return _associationState.value!!.members.filter { x -> x.role != Role.PENDING_MEMBER } + return _associationState.value!!.members.filter { x -> x.role != Role("pending") } } fun getAllUsers(): List{ @@ -63,13 +63,13 @@ class AssociationViewModel(private var user: User, private var assocId: String) return _associationState.value!!.events } - fun acceptNewUser(uid: String) { + fun acceptNewUser(uid: String, role: String) { if (_associationState.value != null && - (user.role == Role.CO_PRESIDENT || user.role == Role.PRESIDENT)) { + (user.role == Role("president") || user.role == Role("co-president"))) { val userList = getPendingUsers().filter { u -> u.uid == uid } if (userList.isEmpty()) return val user = userList[0] - val updatedUser = User(uid, user.name, Role.MEMBER) + val updatedUser = User(uid, user.name, Role(role)) val ass = _associationState.value!! val updatedAssoc = Association( @@ -93,7 +93,7 @@ class AssociationViewModel(private var user: User, private var assocId: String) ass.description, ass.creationDate, ass.status, - ass.members + user, + ass.members + User(user.uid, user.name, Role("pending")), ass.events) associationDatabase.addAssociation(updatedAssoc) } diff --git a/app/src/main/java/com/github/se/assocify/model/entities/Role.kt b/app/src/main/java/com/github/se/assocify/model/entities/Role.kt index f415ae447..5964c78c1 100644 --- a/app/src/main/java/com/github/se/assocify/model/entities/Role.kt +++ b/app/src/main/java/com/github/se/assocify/model/entities/Role.kt @@ -1,10 +1,8 @@ package com.github.se.assocify.model.entities -enum class Role { - PRESIDENT, - CO_PRESIDENT, - TREASURER, - COMITEE, - MEMBER, - PENDING_MEMBER + +data class Role(val name: String) { + constructor() : this("") } + + diff --git a/app/src/main/java/com/github/se/assocify/model/entities/User.kt b/app/src/main/java/com/github/se/assocify/model/entities/User.kt index 9ae11bd21..81f9efa7e 100644 --- a/app/src/main/java/com/github/se/assocify/model/entities/User.kt +++ b/app/src/main/java/com/github/se/assocify/model/entities/User.kt @@ -1,5 +1,5 @@ package com.github.se.assocify.model.entities data class User(val uid: String, val name: String, val role: Role) { - constructor() : this("", "", Role.PENDING_MEMBER) + constructor() : this("", "", Role("pending")) } From 0747d813799e0f15b3bf4f9236df6ed18c039ce1 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Sun, 7 Apr 2024 14:20:03 +0200 Subject: [PATCH 11/32] style: ktfmt --- .../se/assocify/AssociationViewModelTest.kt | 3 +- .../associations/AssociationViewModel.kt | 40 +++++++++---------- .../assocify/model/database/AssociationAPI.kt | 2 - .../github/se/assocify/model/entities/Role.kt | 3 -- 4 files changed, 20 insertions(+), 28 deletions(-) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt index b7be0022d..6c8ff6a70 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt @@ -1,4 +1,3 @@ package com.github.se.assocify -class AssociationViewModelTest { -} \ No newline at end of file +class AssociationViewModelTest {} diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index 04647b3a2..bcb9e286e 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -36,7 +36,7 @@ class AssociationViewModel(private var user: User, private var assocId: String) return _associationState.value!!.members.filter { x -> x.role != Role("pending") } } - fun getAllUsers(): List{ + fun getAllUsers(): List { if (_associationState.value == null) { return emptyList() } @@ -84,32 +84,30 @@ class AssociationViewModel(private var user: User, private var assocId: String) } } - fun requestAssociationAccess(){ + fun requestAssociationAccess() { val ass = _associationState.value!! val updatedAssoc = - Association( - ass.uid, - ass.name, - ass.description, - ass.creationDate, - ass.status, - ass.members + User(user.uid, user.name, Role("pending")), - ass.events) + Association( + ass.uid, + ass.name, + ass.description, + ass.creationDate, + ass.status, + ass.members + User(user.uid, user.name, Role("pending")), + ass.events) associationDatabase.addAssociation(updatedAssoc) } - - fun createNewAssoc(name: String, description: String, creationDate: String, status: String, members: List, events: List){ + fun createNewAssoc( + name: String, + description: String, + creationDate: String, + status: String, + members: List, + events: List + ) { val uid = associationDatabase.getNewId() - val assoc = Association( - uid, - name, - description, - creationDate, - status, - members, - events - ) + val assoc = Association(uid, name, description, creationDate, status, members, events) associationDatabase.addAssociation(assoc) } } diff --git a/app/src/main/java/com/github/se/assocify/model/database/AssociationAPI.kt b/app/src/main/java/com/github/se/assocify/model/database/AssociationAPI.kt index 741292aa1..1ca431dc9 100644 --- a/app/src/main/java/com/github/se/assocify/model/database/AssociationAPI.kt +++ b/app/src/main/java/com/github/se/assocify/model/database/AssociationAPI.kt @@ -65,6 +65,4 @@ class AssociationAPI(db: FirebaseFirestore) : FirebaseApi(db) { * @param id the id of the association to delete */ fun deleteAssociation(id: String) = Tasks.await(delete(id)) - - } diff --git a/app/src/main/java/com/github/se/assocify/model/entities/Role.kt b/app/src/main/java/com/github/se/assocify/model/entities/Role.kt index 5964c78c1..71c86e1f1 100644 --- a/app/src/main/java/com/github/se/assocify/model/entities/Role.kt +++ b/app/src/main/java/com/github/se/assocify/model/entities/Role.kt @@ -1,8 +1,5 @@ package com.github.se.assocify.model.entities - data class Role(val name: String) { constructor() : this("") } - - From 3d30b67cd28d9b7b552c98bf6d07ee674fa45793 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Sun, 7 Apr 2024 14:40:05 +0200 Subject: [PATCH 12/32] fix: set the state as private --- .../java/com/github/se/assocify/AssociationViewModelTest.kt | 4 +++- .../se/assocify/model/associations/AssociationViewModel.kt | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt index 6c8ff6a70..84b90d553 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt @@ -1,3 +1,5 @@ package com.github.se.assocify -class AssociationViewModelTest {} +class AssociationViewModelTest { + +} diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index bcb9e286e..904bd333f 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -11,7 +11,7 @@ import com.google.firebase.firestore.firestore import kotlinx.coroutines.flow.MutableStateFlow class AssociationViewModel(private var user: User, private var assocId: String) : ViewModel() { - val _associationState: MutableStateFlow = MutableStateFlow(null) + private val _associationState: MutableStateFlow = MutableStateFlow(null) private val associationDatabase = AssociationAPI(Firebase.firestore) init { From d3f79aca849bd9e14aa61cae06cac1dd0b648d60 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Sun, 7 Apr 2024 16:42:58 +0200 Subject: [PATCH 13/32] test: added both tests for empty or created assoc --- .../se/assocify/AssociationViewModelTest.kt | 44 +++++++++++++++++++ .../associations/AssociationViewModel.kt | 30 +++++++------ 2 files changed, 61 insertions(+), 13 deletions(-) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt index 84b90d553..b512ef3e0 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt @@ -1,5 +1,49 @@ package com.github.se.assocify +import com.github.se.assocify.model.associations.AssociationViewModel +import com.github.se.assocify.model.database.AssociationAPI +import com.github.se.assocify.model.entities.Event +import com.github.se.assocify.model.entities.Role +import com.github.se.assocify.model.entities.User +import com.google.firebase.Firebase +import com.google.firebase.firestore.firestore +import org.junit.Test + class AssociationViewModelTest { + @Test + fun checkThatEmptyAssocWorksWell() { + val db = AssociationAPI(Firebase.firestore) + val user = User(db.getNewId(), "Carlo", Role("president")) + val assocViewModel = AssociationViewModel(user) + assert(assocViewModel.getPendingUsers() == emptyList()) + assert(assocViewModel.getAllUsers() == emptyList()) + assert(assocViewModel.getRecordedUsers() == emptyList()) + assert(assocViewModel.getEvents() == emptyList()) + assert(assocViewModel.getCreationDate() == "") + assert(assocViewModel.getAssociationName() == "") + } + + @Test + fun checkThatCreateAssocWorksWell() { + val db = AssociationAPI(Firebase.firestore) + val user = User(db.getNewId(), "Carlo", Role("president")) + val user2 = User(db.getNewId(), "Jonathan", Role("co-president")) + val user3 = User(db.getNewId(), "Bigio", Role("pending")) + val assocViewModel = AssociationViewModel(user) + val name = "critify" + val description = "A cool association to have fun with friends!!" + val creationDate = "today" + val status = "new" + val users = listOf(user, user2, user3) + val events = listOf(Event("a", "b", emptyList(), emptyList())) + assocViewModel.createNewAssoc(name, description, creationDate, status ,users, events) + assert(assocViewModel.getPendingUsers() == listOf(user3)) + assert(assocViewModel.getAllUsers() == users) + assert(assocViewModel.getRecordedUsers() == listOf(user, user2)) + assert(assocViewModel.getEvents() == events) + assert(assocViewModel.getCreationDate() == creationDate) + assert(assocViewModel.getAssociationName() == name) + } } + diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index 904bd333f..91dff9dc1 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -10,7 +10,7 @@ import com.google.firebase.Firebase import com.google.firebase.firestore.firestore import kotlinx.coroutines.flow.MutableStateFlow -class AssociationViewModel(private var user: User, private var assocId: String) : ViewModel() { +class AssociationViewModel(private var user: User, private var assocId: String = "") : ViewModel() { private val _associationState: MutableStateFlow = MutableStateFlow(null) private val associationDatabase = AssociationAPI(Firebase.firestore) @@ -19,7 +19,7 @@ class AssociationViewModel(private var user: User, private var assocId: String) } fun update() { - _associationState.value = associationDatabase.getAssociation(assocId) + if (assocId != "") _associationState.value = associationDatabase.getAssociation(assocId) } fun getPendingUsers(): List { @@ -85,17 +85,19 @@ class AssociationViewModel(private var user: User, private var assocId: String) } fun requestAssociationAccess() { - val ass = _associationState.value!! - val updatedAssoc = - Association( - ass.uid, - ass.name, - ass.description, - ass.creationDate, - ass.status, - ass.members + User(user.uid, user.name, Role("pending")), - ass.events) - associationDatabase.addAssociation(updatedAssoc) + if (_associationState.value != null) { + val ass = _associationState.value!! + val updatedAssoc = + Association( + ass.uid, + ass.name, + ass.description, + ass.creationDate, + ass.status, + ass.members + User(user.uid, user.name, Role("pending")), + ass.events) + associationDatabase.addAssociation(updatedAssoc) + } } fun createNewAssoc( @@ -109,5 +111,7 @@ class AssociationViewModel(private var user: User, private var assocId: String) val uid = associationDatabase.getNewId() val assoc = Association(uid, name, description, creationDate, status, members, events) associationDatabase.addAssociation(assoc) + assocId = uid + _associationState.value = assoc } } From db726869e7acc47b1290fa29cfffc521a350246f Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Sun, 7 Apr 2024 16:47:02 +0200 Subject: [PATCH 14/32] style: ktfmt --- .../se/assocify/AssociationViewModelTest.kt | 67 +++++++++---------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt index b512ef3e0..3d96fdbcd 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt @@ -11,39 +11,38 @@ import org.junit.Test class AssociationViewModelTest { - @Test - fun checkThatEmptyAssocWorksWell() { - val db = AssociationAPI(Firebase.firestore) - val user = User(db.getNewId(), "Carlo", Role("president")) - val assocViewModel = AssociationViewModel(user) - assert(assocViewModel.getPendingUsers() == emptyList()) - assert(assocViewModel.getAllUsers() == emptyList()) - assert(assocViewModel.getRecordedUsers() == emptyList()) - assert(assocViewModel.getEvents() == emptyList()) - assert(assocViewModel.getCreationDate() == "") - assert(assocViewModel.getAssociationName() == "") - } + @Test + fun checkThatEmptyAssocWorksWell() { + val db = AssociationAPI(Firebase.firestore) + val user = User(db.getNewId(), "Carlo", Role("president")) + val assocViewModel = AssociationViewModel(user) + assert(assocViewModel.getPendingUsers() == emptyList()) + assert(assocViewModel.getAllUsers() == emptyList()) + assert(assocViewModel.getRecordedUsers() == emptyList()) + assert(assocViewModel.getEvents() == emptyList()) + assert(assocViewModel.getCreationDate() == "") + assert(assocViewModel.getAssociationName() == "") + } - @Test - fun checkThatCreateAssocWorksWell() { - val db = AssociationAPI(Firebase.firestore) - val user = User(db.getNewId(), "Carlo", Role("president")) - val user2 = User(db.getNewId(), "Jonathan", Role("co-president")) - val user3 = User(db.getNewId(), "Bigio", Role("pending")) - val assocViewModel = AssociationViewModel(user) - val name = "critify" - val description = "A cool association to have fun with friends!!" - val creationDate = "today" - val status = "new" - val users = listOf(user, user2, user3) - val events = listOf(Event("a", "b", emptyList(), emptyList())) - assocViewModel.createNewAssoc(name, description, creationDate, status ,users, events) - assert(assocViewModel.getPendingUsers() == listOf(user3)) - assert(assocViewModel.getAllUsers() == users) - assert(assocViewModel.getRecordedUsers() == listOf(user, user2)) - assert(assocViewModel.getEvents() == events) - assert(assocViewModel.getCreationDate() == creationDate) - assert(assocViewModel.getAssociationName() == name) - } + @Test + fun checkThatCreateAssocWorksWell() { + val db = AssociationAPI(Firebase.firestore) + val user = User(db.getNewId(), "Carlo", Role("president")) + val user2 = User(db.getNewId(), "Jonathan", Role("co-president")) + val user3 = User(db.getNewId(), "Bigio", Role("pending")) + val assocViewModel = AssociationViewModel(user) + val name = "critify" + val description = "A cool association to have fun with friends!!" + val creationDate = "today" + val status = "new" + val users = listOf(user, user2, user3) + val events = listOf(Event("a", "b", emptyList(), emptyList())) + assocViewModel.createNewAssoc(name, description, creationDate, status, users, events) + assert(assocViewModel.getPendingUsers() == listOf(user3)) + assert(assocViewModel.getAllUsers() == users) + assert(assocViewModel.getRecordedUsers() == listOf(user, user2)) + assert(assocViewModel.getEvents() == events) + assert(assocViewModel.getCreationDate() == creationDate) + assert(assocViewModel.getAssociationName() == name) + } } - From 0590672a8ebb9a92bce868fc0d655a325b8060ef Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Sun, 7 Apr 2024 17:16:43 +0200 Subject: [PATCH 15/32] test: added the test for the associationAcceptation --- .../se/assocify/AssociationViewModelTest.kt | 26 +++++++++++++++++++ .../associations/AssociationViewModel.kt | 9 +++++++ 2 files changed, 35 insertions(+) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt index 3d96fdbcd..8407353b8 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt @@ -44,5 +44,31 @@ class AssociationViewModelTest { assert(assocViewModel.getEvents() == events) assert(assocViewModel.getCreationDate() == creationDate) assert(assocViewModel.getAssociationName() == name) + + assocViewModel.deleteAssoc() + assert(assocViewModel.getAllUsers() == emptyList()) + } + + @Test + fun checkThatAcceptationWorks() { + val db = AssociationAPI(Firebase.firestore) + val user = User(db.getNewId(), "Carlo", Role("president")) + val user2 = User(db.getNewId(), "Jonathan", Role("co-president")) + val user3 = User(db.getNewId(), "Bigio", Role("pending")) + val assocViewModel = AssociationViewModel(user) + val name = "critify" + val description = "A cool association to have fun with friends!!" + val creationDate = "today" + val status = "new" + val users = listOf(user, user2, user3) + val events = listOf(Event("a", "b", emptyList(), emptyList())) + assocViewModel.createNewAssoc(name, description, creationDate, status, users, events) + assert(assocViewModel.getPendingUsers() == listOf(user3)) + assocViewModel.acceptNewUser(user3.uid, "captain") + assert(assocViewModel.getPendingUsers() == emptyList()) + val x = assocViewModel.getRecordedUsers() + val newUser3 = User(user3.uid, user3.name, Role("captain")) + assert(assocViewModel.getRecordedUsers() == listOf(user, user2, newUser3)) + assocViewModel.deleteAssoc() } } diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index 91dff9dc1..48950a564 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -23,6 +23,7 @@ class AssociationViewModel(private var user: User, private var assocId: String = } fun getPendingUsers(): List { + update() if (_associationState.value == null) { return emptyList() } @@ -30,6 +31,7 @@ class AssociationViewModel(private var user: User, private var assocId: String = } fun getRecordedUsers(): List { + update() if (_associationState.value == null) { return emptyList() } @@ -37,6 +39,7 @@ class AssociationViewModel(private var user: User, private var assocId: String = } fun getAllUsers(): List { + update() if (_associationState.value == null) { return emptyList() } @@ -114,4 +117,10 @@ class AssociationViewModel(private var user: User, private var assocId: String = assocId = uid _associationState.value = assoc } + + fun deleteAssoc() { + associationDatabase.deleteAssociation(assocId) + assocId = "" + _associationState.value = null + } } From dfc7eda97ff9cc916fd057a85f6b7fe78a2fa767 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Sun, 7 Apr 2024 18:37:34 +0200 Subject: [PATCH 16/32] feat: added the getAllAssociations and getFilteredAssociation functions --- .../se/assocify/AssociationViewModelTest.kt | 43 +++++++++++++++++++ .../associations/AssociationViewModel.kt | 14 ++++++ 2 files changed, 57 insertions(+) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt index 8407353b8..e7ee3a04d 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt @@ -71,4 +71,47 @@ class AssociationViewModelTest { assert(assocViewModel.getRecordedUsers() == listOf(user, user2, newUser3)) assocViewModel.deleteAssoc() } + + @Test + fun checkThatRequestWorks() { + val db = AssociationAPI(Firebase.firestore) + val user = User(db.getNewId(), "Carlo", Role("president")) + val assocViewModel = AssociationViewModel(user) + val name = "critify" + val description = "A cool association to have fun with friends!!" + val creationDate = "today" + val status = "new" + val users = listOf(user) + val events = listOf(Event("a", "b", emptyList(), emptyList())) + assocViewModel.createNewAssoc(name, description, creationDate, status, users, events) + + val newUser = User(db.getNewId(), "Bigio", Role("pending")) + val inscriptionAssociationModel = AssociationViewModel(newUser, assocViewModel.getAssocId()) + inscriptionAssociationModel.requestAssociationAccess() + assert(assocViewModel.getPendingUsers().contains(newUser)) + assocViewModel.deleteAssoc() + } + + @Test + fun checkThatFiltersWork(){ + val db = AssociationAPI(Firebase.firestore) + val user = User(db.getNewId(), "Carlo", Role("president")) + val assocViewModel = AssociationViewModel(user) + val name = "critify" + val description = "A cool association to have fun with friends!!" + val creationDate = "today" + val status = "new" + val users = listOf(user) + val events = listOf(Event("a", "b", emptyList(), emptyList())) + assocViewModel.createNewAssoc("a", description, creationDate, status, users, events) + assocViewModel.createNewAssoc("b", description, creationDate, status, users, events) + assocViewModel.createNewAssoc("c", description, creationDate, status, users, events) + assocViewModel.createNewAssoc("d", description, creationDate, status, users, events) + assocViewModel.createNewAssoc("testTheAssoc", "a sample testing description", creationDate, status, users, events) + assert(assocViewModel.getAllAssociations().size == 5) + assert(assocViewModel.getFilteredAssociations("testTheAssoc")[0].description == "a sample testing description") + + + } + } diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index 48950a564..3bc835782 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -22,6 +22,10 @@ class AssociationViewModel(private var user: User, private var assocId: String = if (assocId != "") _associationState.value = associationDatabase.getAssociation(assocId) } + fun getAssocId(): String { + return assocId + } + fun getPendingUsers(): List { update() if (_associationState.value == null) { @@ -119,8 +123,18 @@ class AssociationViewModel(private var user: User, private var assocId: String = } fun deleteAssoc() { + if(user.role != Role("president")) return associationDatabase.deleteAssociation(assocId) assocId = "" _associationState.value = null } + + fun getAllAssociations(): List{ + if (_associationState.value == null) return emptyList() + return associationDatabase.getAssociations() + } + + fun getFilteredAssociations(searchQuery: String): List{ + return getAllAssociations().filter { ass -> ass.name == searchQuery || ass.description == searchQuery} + } } From f81ccd82aa6c695ad4f74717f03faee8703fd275 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Sun, 7 Apr 2024 18:45:31 +0200 Subject: [PATCH 17/32] test: added the test for the new functions --- .../se/assocify/AssociationViewModelTest.kt | 12 ++++++------ .../model/associations/AssociationViewModel.kt | 16 +++++++++------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt index e7ee3a04d..13d6156f7 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt @@ -93,7 +93,7 @@ class AssociationViewModelTest { } @Test - fun checkThatFiltersWork(){ + fun checkThatFiltersWork() { val db = AssociationAPI(Firebase.firestore) val user = User(db.getNewId(), "Carlo", Role("president")) val assocViewModel = AssociationViewModel(user) @@ -107,11 +107,11 @@ class AssociationViewModelTest { assocViewModel.createNewAssoc("b", description, creationDate, status, users, events) assocViewModel.createNewAssoc("c", description, creationDate, status, users, events) assocViewModel.createNewAssoc("d", description, creationDate, status, users, events) - assocViewModel.createNewAssoc("testTheAssoc", "a sample testing description", creationDate, status, users, events) + assocViewModel.createNewAssoc( + "testTheAssoc", "a sample testing description", creationDate, status, users, events) assert(assocViewModel.getAllAssociations().size == 5) - assert(assocViewModel.getFilteredAssociations("testTheAssoc")[0].description == "a sample testing description") - - + assert( + assocViewModel.getFilteredAssociations("testTheAssoc")[0].description == + "a sample testing description") } - } diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt index 3bc835782..37e43225f 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt @@ -123,18 +123,20 @@ class AssociationViewModel(private var user: User, private var assocId: String = } fun deleteAssoc() { - if(user.role != Role("president")) return + if (user.role != Role("president")) return associationDatabase.deleteAssociation(assocId) assocId = "" _associationState.value = null } - fun getAllAssociations(): List{ - if (_associationState.value == null) return emptyList() - return associationDatabase.getAssociations() - } + fun getAllAssociations(): List { + if (_associationState.value == null) return emptyList() + return associationDatabase.getAssociations() + } - fun getFilteredAssociations(searchQuery: String): List{ - return getAllAssociations().filter { ass -> ass.name == searchQuery || ass.description == searchQuery} + fun getFilteredAssociations(searchQuery: String): List { + return getAllAssociations().filter { ass -> + ass.name == searchQuery || ass.description == searchQuery } + } } From 1830048c8a919266f4538bae385738695f07bc3d Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 8 Apr 2024 15:38:53 +0200 Subject: [PATCH 18/32] fix: transformed fake viewModel in utils class --- ...nViewModelTest.kt => AssociationUtilsTest.kt} | 16 +++++++++++++++- ...sociationViewModel.kt => AssociationUtils.kt} | 4 ++-- 2 files changed, 17 insertions(+), 3 deletions(-) rename app/src/androidTest/java/com/github/se/assocify/{AssociationViewModelTest.kt => AssociationUtilsTest.kt} (89%) rename app/src/main/java/com/github/se/assocify/model/associations/{AssociationViewModel.kt => AssociationUtils.kt} (95%) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt similarity index 89% rename from app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt rename to app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt index 13d6156f7..3048f67b9 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationViewModelTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt @@ -2,14 +2,22 @@ package com.github.se.assocify import com.github.se.assocify.model.associations.AssociationViewModel import com.github.se.assocify.model.database.AssociationAPI +import com.github.se.assocify.model.entities.Association import com.github.se.assocify.model.entities.Event import com.github.se.assocify.model.entities.Role import com.github.se.assocify.model.entities.User import com.google.firebase.Firebase +import com.google.firebase.firestore.CollectionReference +import com.google.firebase.firestore.DocumentReference +import com.google.firebase.firestore.DocumentSnapshot +import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.firestore import org.junit.Test +import org.mockito.Mock +import org.mockito.Mockito -class AssociationViewModelTest { +class AssociationUtilsTest { + @Mock @Test fun checkThatEmptyAssocWorksWell() { @@ -104,14 +112,20 @@ class AssociationViewModelTest { val users = listOf(user) val events = listOf(Event("a", "b", emptyList(), emptyList())) assocViewModel.createNewAssoc("a", description, creationDate, status, users, events) + val i1 = assocViewModel.getAssocId() assocViewModel.createNewAssoc("b", description, creationDate, status, users, events) + val i2 = assocViewModel.getAssocId() assocViewModel.createNewAssoc("c", description, creationDate, status, users, events) + val i3 = assocViewModel.getAssocId() assocViewModel.createNewAssoc("d", description, creationDate, status, users, events) + val i4 = assocViewModel.getAssocId() assocViewModel.createNewAssoc( "testTheAssoc", "a sample testing description", creationDate, status, users, events) + val i = assocViewModel.getAllAssociations().size assert(assocViewModel.getAllAssociations().size == 5) assert( assocViewModel.getFilteredAssociations("testTheAssoc")[0].description == "a sample testing description") + assocViewModel.deleteAssoc() } } diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt similarity index 95% rename from app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt rename to app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt index 37e43225f..2b1710afa 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationViewModel.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt @@ -7,12 +7,12 @@ import com.github.se.assocify.model.entities.Event import com.github.se.assocify.model.entities.Role import com.github.se.assocify.model.entities.User import com.google.firebase.Firebase +import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.firestore import kotlinx.coroutines.flow.MutableStateFlow -class AssociationViewModel(private var user: User, private var assocId: String = "") : ViewModel() { +class AssociationUtils(private var user: User, private var assocId: String = "", private val associationDatabase: AssociationAPI) : ViewModel() { private val _associationState: MutableStateFlow = MutableStateFlow(null) - private val associationDatabase = AssociationAPI(Firebase.firestore) init { update() From 5ce0373e84c58cde565c03fe0d5b3b6b558497b9 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 8 Apr 2024 16:38:13 +0200 Subject: [PATCH 19/32] fix: reverted to versions without test, trying to understand how Mockk works --- .../se/assocify/AssociationUtilsTest.kt | 82 +++++++++++-------- .../model/associations/AssociationUtils.kt | 12 +-- 2 files changed, 55 insertions(+), 39 deletions(-) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt index 3048f67b9..b66f9ea93 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt @@ -1,60 +1,73 @@ package com.github.se.assocify -import com.github.se.assocify.model.associations.AssociationViewModel +import com.github.se.assocify.model.associations.AssociationUtils import com.github.se.assocify.model.database.AssociationAPI import com.github.se.assocify.model.entities.Association -import com.github.se.assocify.model.entities.Event import com.github.se.assocify.model.entities.Role import com.github.se.assocify.model.entities.User -import com.google.firebase.Firebase +import com.google.android.gms.tasks.Tasks import com.google.firebase.firestore.CollectionReference import com.google.firebase.firestore.DocumentReference import com.google.firebase.firestore.DocumentSnapshot import com.google.firebase.firestore.FirebaseFirestore -import com.google.firebase.firestore.firestore +import org.junit.Before import org.junit.Test import org.mockito.Mock import org.mockito.Mockito class AssociationUtilsTest { - @Mock + @Mock private lateinit var db: FirebaseFirestore + + private lateinit var assoUtilsPresident: AssociationUtils + private lateinit var assoUtilsNewUser: AssociationUtils + private val documentSnapshot = Mockito.mock(DocumentSnapshot::class.java) + private val documentReference = Mockito.mock(DocumentReference::class.java) + private val collectionReference = Mockito.mock(CollectionReference::class.java) + private val president = User("testId", "Carlo", Role("president")) + val oldAsso = + Association( + "aId", + "cassify", + "a cool association", + "31/09/2005", + "active", + listOf(president), + emptyList()) + private val newUser = User() + + /* + @Before + fun setup() { + + } @Test fun checkThatEmptyAssocWorksWell() { - val db = AssociationAPI(Firebase.firestore) - val user = User(db.getNewId(), "Carlo", Role("president")) - val assocViewModel = AssociationViewModel(user) - assert(assocViewModel.getPendingUsers() == emptyList()) - assert(assocViewModel.getAllUsers() == emptyList()) - assert(assocViewModel.getRecordedUsers() == emptyList()) - assert(assocViewModel.getEvents() == emptyList()) - assert(assocViewModel.getCreationDate() == "") - assert(assocViewModel.getAssociationName() == "") + assert(assoUtilsNewUser.getPendingUsers() == emptyList()) + assert(assoUtilsNewUser.getRecordedUsers() == emptyList()) + assert(assoUtilsNewUser.getEvents() == emptyList()) + assert(assoUtilsNewUser.getCreationDate() == "") + assert(assoUtilsNewUser.getAssociationName() == "") } @Test fun checkThatCreateAssocWorksWell() { - val db = AssociationAPI(Firebase.firestore) - val user = User(db.getNewId(), "Carlo", Role("president")) - val user2 = User(db.getNewId(), "Jonathan", Role("co-president")) - val user3 = User(db.getNewId(), "Bigio", Role("pending")) - val assocViewModel = AssociationViewModel(user) - val name = "critify" - val description = "A cool association to have fun with friends!!" - val creationDate = "today" - val status = "new" - val users = listOf(user, user2, user3) - val events = listOf(Event("a", "b", emptyList(), emptyList())) - assocViewModel.createNewAssoc(name, description, creationDate, status, users, events) - assert(assocViewModel.getPendingUsers() == listOf(user3)) - assert(assocViewModel.getAllUsers() == users) - assert(assocViewModel.getRecordedUsers() == listOf(user, user2)) - assert(assocViewModel.getEvents() == events) - assert(assocViewModel.getCreationDate() == creationDate) - assert(assocViewModel.getAssociationName() == name) + assoUtilsPresident = + AssociationUtils( + user = president, assocId = oldAsso.uid, associationDatabase = AssociationAPI(db)) + assoUtilsNewUser = AssociationUtils(user = newUser, associationDatabase = AssociationAPI(db)) + Mockito.`when`(db.collection(Mockito.any())).thenReturn(collectionReference) + Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) + .thenReturn(documentReference) + Mockito.`when`(documentReference.set(oldAsso)).thenReturn(Tasks.forResult(null)) - assocViewModel.deleteAssoc() - assert(assocViewModel.getAllUsers() == emptyList()) + val newAsso = + assoUtilsNewUser.createNewAssoc("b", "desc", "date", "status", listOf(newUser), emptyList()) + val api = AssociationAPI(db) + assert(assoUtilsNewUser.getAllUsers().isNotEmpty()) + Mockito.verify(db).collection(api.collectionName) + Mockito.verify(db.collection(api.collectionName)).document(newAsso.uid) + Mockito.verify(db.collection(api.collectionName).document(newAsso.uid)).set(newAsso) } @Test @@ -128,4 +141,5 @@ class AssociationUtilsTest { "a sample testing description") assocViewModel.deleteAssoc() } + */ } diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt index 2b1710afa..0e78bbdd1 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt @@ -6,12 +6,13 @@ import com.github.se.assocify.model.entities.Association import com.github.se.assocify.model.entities.Event import com.github.se.assocify.model.entities.Role import com.github.se.assocify.model.entities.User -import com.google.firebase.Firebase -import com.google.firebase.firestore.FirebaseFirestore -import com.google.firebase.firestore.firestore import kotlinx.coroutines.flow.MutableStateFlow -class AssociationUtils(private var user: User, private var assocId: String = "", private val associationDatabase: AssociationAPI) : ViewModel() { +class AssociationUtils( + private var user: User, + private var assocId: String = "", + private val associationDatabase: AssociationAPI +) : ViewModel() { private val _associationState: MutableStateFlow = MutableStateFlow(null) init { @@ -114,12 +115,13 @@ class AssociationUtils(private var user: User, private var assocId: String = "", status: String, members: List, events: List - ) { + ): Association { val uid = associationDatabase.getNewId() val assoc = Association(uid, name, description, creationDate, status, members, events) associationDatabase.addAssociation(assoc) assocId = uid _associationState.value = assoc + return assoc } fun deleteAssoc() { From a3f47c658e866c9d7c7c2d1bd198b786e0e3167f Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 8 Apr 2024 17:13:43 +0200 Subject: [PATCH 20/32] test: done the empty test --- .../se/assocify/AssociationUtilsTest.kt | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt index b66f9ea93..a3df7bb16 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt @@ -5,7 +5,6 @@ import com.github.se.assocify.model.database.AssociationAPI import com.github.se.assocify.model.entities.Association import com.github.se.assocify.model.entities.Role import com.github.se.assocify.model.entities.User -import com.google.android.gms.tasks.Tasks import com.google.firebase.firestore.CollectionReference import com.google.firebase.firestore.DocumentReference import com.google.firebase.firestore.DocumentSnapshot @@ -34,15 +33,17 @@ class AssociationUtilsTest { listOf(president), emptyList()) private val newUser = User() + private lateinit var assoApi: AssociationAPI - /* @Before fun setup() { - + db = Mockito.mock(FirebaseFirestore::class.java) + assoApi = AssociationAPI(db) } @Test fun checkThatEmptyAssocWorksWell() { + assoUtilsNewUser = AssociationUtils(newUser, associationDatabase = assoApi) assert(assoUtilsNewUser.getPendingUsers() == emptyList()) assert(assoUtilsNewUser.getRecordedUsers() == emptyList()) assert(assoUtilsNewUser.getEvents() == emptyList()) @@ -50,26 +51,29 @@ class AssociationUtilsTest { assert(assoUtilsNewUser.getAssociationName() == "") } + /* @Test fun checkThatCreateAssocWorksWell() { - assoUtilsPresident = - AssociationUtils( - user = president, assocId = oldAsso.uid, associationDatabase = AssociationAPI(db)) - assoUtilsNewUser = AssociationUtils(user = newUser, associationDatabase = AssociationAPI(db)) - Mockito.`when`(db.collection(Mockito.any())).thenReturn(collectionReference) - Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) - .thenReturn(documentReference) - Mockito.`when`(documentReference.set(oldAsso)).thenReturn(Tasks.forResult(null)) + assoUtilsNewUser = AssociationUtils(user = newUser, associationDatabase = assoApi) + val assoTest = Association("fakeId", + "b", "desc", "date", "status", listOf(newUser), emptyList()) + Mockito.`when`(db.collection(Mockito.any())).thenReturn(Mockito.mock()) + Mockito.`when`(db.collection(Mockito.any()).document()).thenReturn(documentReference) + Mockito.`when`(documentReference.id).thenReturn("fakeId") + Mockito.`when`(documentReference.set(assoTest)).thenReturn(Tasks.forResult(null)) val newAsso = assoUtilsNewUser.createNewAssoc("b", "desc", "date", "status", listOf(newUser), emptyList()) - val api = AssociationAPI(db) - assert(assoUtilsNewUser.getAllUsers().isNotEmpty()) - Mockito.verify(db).collection(api.collectionName) - Mockito.verify(db.collection(api.collectionName)).document(newAsso.uid) - Mockito.verify(db.collection(api.collectionName).document(newAsso.uid)).set(newAsso) + + Mockito.verify(db).collection(assoApi.collectionName) + Mockito.verify(db.collection(assoApi.collectionName)).document(newAsso.uid) + Mockito.verify(db.collection(assoApi.collectionName).document(newAsso.uid)).set(newAsso) + assert(assoUtilsNewUser.getAllUsers().isNotEmpty()) } + */ + + /* @Test fun checkThatAcceptationWorks() { val db = AssociationAPI(Firebase.firestore) From 356f60f705883552ac870c6162383a3efb41b894 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 8 Apr 2024 18:06:49 +0200 Subject: [PATCH 21/32] fix: removed the createAssociation function since it probably won't be useful --- .../se/assocify/AssociationUtilsTest.kt | 123 +++++------------- .../model/associations/AssociationUtils.kt | 16 --- 2 files changed, 34 insertions(+), 105 deletions(-) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt index a3df7bb16..5fef432a4 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt @@ -5,10 +5,12 @@ import com.github.se.assocify.model.database.AssociationAPI import com.github.se.assocify.model.entities.Association import com.github.se.assocify.model.entities.Role import com.github.se.assocify.model.entities.User +import com.google.android.gms.tasks.Tasks import com.google.firebase.firestore.CollectionReference import com.google.firebase.firestore.DocumentReference import com.google.firebase.firestore.DocumentSnapshot import com.google.firebase.firestore.FirebaseFirestore +import com.google.firebase.firestore.QuerySnapshot import org.junit.Before import org.junit.Test import org.mockito.Mock @@ -23,6 +25,7 @@ class AssociationUtilsTest { private val documentReference = Mockito.mock(DocumentReference::class.java) private val collectionReference = Mockito.mock(CollectionReference::class.java) private val president = User("testId", "Carlo", Role("president")) + private val newUser = User() val oldAsso = Association( "aId", @@ -32,7 +35,15 @@ class AssociationUtilsTest { "active", listOf(president), emptyList()) - private val newUser = User() + val oldAssoUpdated = + Association( + "aId", + "cassify", + "a cool association", + "31/09/2005", + "active", + listOf(president, newUser), + emptyList()) private lateinit var assoApi: AssociationAPI @Before @@ -51,99 +62,33 @@ class AssociationUtilsTest { assert(assoUtilsNewUser.getAssociationName() == "") } - /* @Test - fun checkThatCreateAssocWorksWell() { - assoUtilsNewUser = AssociationUtils(user = newUser, associationDatabase = assoApi) - val assoTest = Association("fakeId", - "b", "desc", "date", "status", listOf(newUser), emptyList()) - Mockito.`when`(db.collection(Mockito.any())).thenReturn(Mockito.mock()) - Mockito.`when`(db.collection(Mockito.any()).document()).thenReturn(documentReference) - Mockito.`when`(documentReference.id).thenReturn("fakeId") - Mockito.`when`(documentReference.set(assoTest)).thenReturn(Tasks.forResult(null)) + fun checkRequestWorks() { + Mockito.`when`(db.collection(Mockito.any())).thenReturn(collectionReference) + Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) + .thenReturn(documentReference) + Mockito.`when`(documentReference.set(oldAsso)).thenReturn(Tasks.forResult(null)) - val newAsso = - assoUtilsNewUser.createNewAssoc("b", "desc", "date", "status", listOf(newUser), emptyList()) + assoApi.addAssociation(oldAsso) - Mockito.verify(db).collection(assoApi.collectionName) - Mockito.verify(db.collection(assoApi.collectionName)).document(newAsso.uid) - Mockito.verify(db.collection(assoApi.collectionName).document(newAsso.uid)).set(newAsso) - assert(assoUtilsNewUser.getAllUsers().isNotEmpty()) - } + Mockito.`when`(documentSnapshot.exists()).thenReturn(true) + Mockito.`when`(db.collection(Mockito.any())).thenReturn(collectionReference) + val query = Tasks.forResult(Mockito.mock(QuerySnapshot::class.java)) + Mockito.`when`(db.collection(Mockito.any()).get()).thenReturn(query) - */ + Mockito.`when`(query.result!!.documents).thenReturn(listOf(documentSnapshot)) + Mockito.`when`( + listOf(documentSnapshot).map { document -> document.toObject(Association::class.java) }) + .thenReturn(listOf(oldAsso)) + Mockito.`when`(documentSnapshot.toObject(Association::class.java)).thenReturn(oldAsso) - /* - @Test - fun checkThatAcceptationWorks() { - val db = AssociationAPI(Firebase.firestore) - val user = User(db.getNewId(), "Carlo", Role("president")) - val user2 = User(db.getNewId(), "Jonathan", Role("co-president")) - val user3 = User(db.getNewId(), "Bigio", Role("pending")) - val assocViewModel = AssociationViewModel(user) - val name = "critify" - val description = "A cool association to have fun with friends!!" - val creationDate = "today" - val status = "new" - val users = listOf(user, user2, user3) - val events = listOf(Event("a", "b", emptyList(), emptyList())) - assocViewModel.createNewAssoc(name, description, creationDate, status, users, events) - assert(assocViewModel.getPendingUsers() == listOf(user3)) - assocViewModel.acceptNewUser(user3.uid, "captain") - assert(assocViewModel.getPendingUsers() == emptyList()) - val x = assocViewModel.getRecordedUsers() - val newUser3 = User(user3.uid, user3.name, Role("captain")) - assert(assocViewModel.getRecordedUsers() == listOf(user, user2, newUser3)) - assocViewModel.deleteAssoc() - } - - @Test - fun checkThatRequestWorks() { - val db = AssociationAPI(Firebase.firestore) - val user = User(db.getNewId(), "Carlo", Role("president")) - val assocViewModel = AssociationViewModel(user) - val name = "critify" - val description = "A cool association to have fun with friends!!" - val creationDate = "today" - val status = "new" - val users = listOf(user) - val events = listOf(Event("a", "b", emptyList(), emptyList())) - assocViewModel.createNewAssoc(name, description, creationDate, status, users, events) + assoUtilsPresident = AssociationUtils(president, oldAsso.uid, assoApi) + assoUtilsNewUser = AssociationUtils(newUser, oldAsso.uid, assoApi) + assoUtilsNewUser.requestAssociationAccess() - val newUser = User(db.getNewId(), "Bigio", Role("pending")) - val inscriptionAssociationModel = AssociationViewModel(newUser, assocViewModel.getAssocId()) - inscriptionAssociationModel.requestAssociationAccess() - assert(assocViewModel.getPendingUsers().contains(newUser)) - assocViewModel.deleteAssoc() - } - - @Test - fun checkThatFiltersWork() { - val db = AssociationAPI(Firebase.firestore) - val user = User(db.getNewId(), "Carlo", Role("president")) - val assocViewModel = AssociationViewModel(user) - val name = "critify" - val description = "A cool association to have fun with friends!!" - val creationDate = "today" - val status = "new" - val users = listOf(user) - val events = listOf(Event("a", "b", emptyList(), emptyList())) - assocViewModel.createNewAssoc("a", description, creationDate, status, users, events) - val i1 = assocViewModel.getAssocId() - assocViewModel.createNewAssoc("b", description, creationDate, status, users, events) - val i2 = assocViewModel.getAssocId() - assocViewModel.createNewAssoc("c", description, creationDate, status, users, events) - val i3 = assocViewModel.getAssocId() - assocViewModel.createNewAssoc("d", description, creationDate, status, users, events) - val i4 = assocViewModel.getAssocId() - assocViewModel.createNewAssoc( - "testTheAssoc", "a sample testing description", creationDate, status, users, events) - val i = assocViewModel.getAllAssociations().size - assert(assocViewModel.getAllAssociations().size == 5) - assert( - assocViewModel.getFilteredAssociations("testTheAssoc")[0].description == - "a sample testing description") - assocViewModel.deleteAssoc() + Mockito.verify(db).collection(assoApi.collectionName) + Mockito.verify(db.collection(assoApi.collectionName)).document(oldAsso.uid) + Mockito.verify(db.collection(assoApi.collectionName).document(oldAsso.uid)).set(oldAssoUpdated) + assert(assoUtilsPresident.getPendingUsers() == listOf(newUser)) } - */ } diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt index 0e78bbdd1..a843390ec 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt @@ -108,22 +108,6 @@ class AssociationUtils( } } - fun createNewAssoc( - name: String, - description: String, - creationDate: String, - status: String, - members: List, - events: List - ): Association { - val uid = associationDatabase.getNewId() - val assoc = Association(uid, name, description, creationDate, status, members, events) - associationDatabase.addAssociation(assoc) - assocId = uid - _associationState.value = assoc - return assoc - } - fun deleteAssoc() { if (user.role != Role("president")) return associationDatabase.deleteAssociation(assocId) From 5c798afb5f0da6c5517a0975155dedc484e0b8ca Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 8 Apr 2024 18:26:06 +0200 Subject: [PATCH 22/32] fix: finally the createAssociation will maybe be useful --- .../se/assocify/AssociationUtilsTest.kt | 22 +++++++++---------- .../model/associations/AssociationUtils.kt | 16 ++++++++++++++ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt index 5fef432a4..750935f7f 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt @@ -10,7 +10,6 @@ import com.google.firebase.firestore.CollectionReference import com.google.firebase.firestore.DocumentReference import com.google.firebase.firestore.DocumentSnapshot import com.google.firebase.firestore.FirebaseFirestore -import com.google.firebase.firestore.QuerySnapshot import org.junit.Before import org.junit.Test import org.mockito.Mock @@ -48,8 +47,7 @@ class AssociationUtilsTest { @Before fun setup() { - db = Mockito.mock(FirebaseFirestore::class.java) - assoApi = AssociationAPI(db) + assoApi = Mockito.mock(AssociationAPI::class.java) } @Test @@ -64,26 +62,26 @@ class AssociationUtilsTest { @Test fun checkRequestWorks() { + // adding the value to the db Mockito.`when`(db.collection(Mockito.any())).thenReturn(collectionReference) Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) .thenReturn(documentReference) Mockito.`when`(documentReference.set(oldAsso)).thenReturn(Tasks.forResult(null)) - assoApi.addAssociation(oldAsso) + // adding the utils inside Mockito.`when`(documentSnapshot.exists()).thenReturn(true) - Mockito.`when`(db.collection(Mockito.any())).thenReturn(collectionReference) - val query = Tasks.forResult(Mockito.mock(QuerySnapshot::class.java)) - Mockito.`when`(db.collection(Mockito.any()).get()).thenReturn(query) - - Mockito.`when`(query.result!!.documents).thenReturn(listOf(documentSnapshot)) - Mockito.`when`( - listOf(documentSnapshot).map { document -> document.toObject(Association::class.java) }) - .thenReturn(listOf(oldAsso)) Mockito.`when`(documentSnapshot.toObject(Association::class.java)).thenReturn(oldAsso) + Mockito.`when`(documentReference.get()).thenReturn(Tasks.forResult(documentSnapshot)) + val task = Tasks.forResult(documentSnapshot) + Mockito.`when`(db.collection(Mockito.any())).thenReturn(Mockito.mock()) + Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) + .thenReturn(documentReference) assoUtilsPresident = AssociationUtils(president, oldAsso.uid, assoApi) assoUtilsNewUser = AssociationUtils(newUser, oldAsso.uid, assoApi) + + // adding the assoUtilsNewUser.requestAssociationAccess() Mockito.verify(db).collection(assoApi.collectionName) diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt index a843390ec..0e78bbdd1 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt @@ -108,6 +108,22 @@ class AssociationUtils( } } + fun createNewAssoc( + name: String, + description: String, + creationDate: String, + status: String, + members: List, + events: List + ): Association { + val uid = associationDatabase.getNewId() + val assoc = Association(uid, name, description, creationDate, status, members, events) + associationDatabase.addAssociation(assoc) + assocId = uid + _associationState.value = assoc + return assoc + } + fun deleteAssoc() { if (user.role != Role("president")) return associationDatabase.deleteAssociation(assocId) From 8ddd4da735db3fa15de5974e7e72a4eda02fdfb5 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 8 Apr 2024 18:59:00 +0200 Subject: [PATCH 23/32] test: restarted the tests in the good way --- app/build.gradle.kts | 1 + .../se/assocify/AssociationUtilsTest.kt | 86 +++++++------------ 2 files changed, 32 insertions(+), 55 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index db3fbb218..46405c03b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -127,6 +127,7 @@ dependencies { implementation("com.squareup.okhttp3:okhttp:3.14.9") androidTestImplementation("org.mockito:mockito-android:5.11.0") + testImplementation ("org.mockito:mockito-inline:3.11.2") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2") // Roboelectric diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt index 750935f7f..e5d70213e 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt @@ -2,6 +2,7 @@ package com.github.se.assocify import com.github.se.assocify.model.associations.AssociationUtils import com.github.se.assocify.model.database.AssociationAPI +import com.github.se.assocify.model.database.FirebaseApi import com.github.se.assocify.model.entities.Association import com.github.se.assocify.model.entities.Role import com.github.se.assocify.model.entities.User @@ -13,46 +14,46 @@ import com.google.firebase.firestore.FirebaseFirestore import org.junit.Before import org.junit.Test import org.mockito.Mock +import org.mockito.MockMakers import org.mockito.Mockito +import org.mockito.Mockito.mock class AssociationUtilsTest { - @Mock private lateinit var db: FirebaseFirestore - - private lateinit var assoUtilsPresident: AssociationUtils - private lateinit var assoUtilsNewUser: AssociationUtils - private val documentSnapshot = Mockito.mock(DocumentSnapshot::class.java) - private val documentReference = Mockito.mock(DocumentReference::class.java) - private val collectionReference = Mockito.mock(CollectionReference::class.java) - private val president = User("testId", "Carlo", Role("president")) - private val newUser = User() - val oldAsso = - Association( - "aId", - "cassify", - "a cool association", - "31/09/2005", - "active", - listOf(president), - emptyList()) - val oldAssoUpdated = - Association( - "aId", - "cassify", - "a cool association", - "31/09/2005", - "active", - listOf(president, newUser), - emptyList()) + private lateinit var db: FirebaseFirestore private lateinit var assoApi: AssociationAPI + private val documentSnapshot = Mockito.mock(DocumentSnapshot::class.java) + private val documentReference = Mockito.mock(DocumentReference::class.java) + private val collectionReference = Mockito.mock(CollectionReference::class.java) + private val president = User("testId", "Carlo", Role("president")) + private val newUser = User() + val oldAsso = + Association( + "aId", + "cassify", + "a cool association", + "31/09/2005", + "active", + listOf(president), + emptyList()) + val oldAssoUpdated = + Association( + "aId", + "cassify", + "a cool association", + "31/09/2005", + "active", + listOf(president, newUser), + emptyList()) @Before fun setup() { - assoApi = Mockito.mock(AssociationAPI::class.java) + db = Mockito.mock(FirebaseFirestore::class.java) + assoApi = AssociationAPI(db) } @Test fun checkThatEmptyAssocWorksWell() { - assoUtilsNewUser = AssociationUtils(newUser, associationDatabase = assoApi) + val assoUtilsNewUser = AssociationUtils(newUser, associationDatabase = assoApi) assert(assoUtilsNewUser.getPendingUsers() == emptyList()) assert(assoUtilsNewUser.getRecordedUsers() == emptyList()) assert(assoUtilsNewUser.getEvents() == emptyList()) @@ -61,32 +62,7 @@ class AssociationUtilsTest { } @Test - fun checkRequestWorks() { - // adding the value to the db - Mockito.`when`(db.collection(Mockito.any())).thenReturn(collectionReference) - Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) - .thenReturn(documentReference) - Mockito.`when`(documentReference.set(oldAsso)).thenReturn(Tasks.forResult(null)) - assoApi.addAssociation(oldAsso) - - // adding the utils inside - Mockito.`when`(documentSnapshot.exists()).thenReturn(true) - Mockito.`when`(documentSnapshot.toObject(Association::class.java)).thenReturn(oldAsso) - Mockito.`when`(documentReference.get()).thenReturn(Tasks.forResult(documentSnapshot)) - - val task = Tasks.forResult(documentSnapshot) - Mockito.`when`(db.collection(Mockito.any())).thenReturn(Mockito.mock()) - Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) - .thenReturn(documentReference) - assoUtilsPresident = AssociationUtils(president, oldAsso.uid, assoApi) - assoUtilsNewUser = AssociationUtils(newUser, oldAsso.uid, assoApi) - - // adding the - assoUtilsNewUser.requestAssociationAccess() + fun checkCreateWorks() { - Mockito.verify(db).collection(assoApi.collectionName) - Mockito.verify(db.collection(assoApi.collectionName)).document(oldAsso.uid) - Mockito.verify(db.collection(assoApi.collectionName).document(oldAsso.uid)).set(oldAssoUpdated) - assert(assoUtilsPresident.getPendingUsers() == listOf(newUser)) } } From 5c0bbafe0d34c4050cb05adb6a7ae602a9a08fae Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 8 Apr 2024 19:44:38 +0200 Subject: [PATCH 24/32] test: added the checkAcceptedNewUser test --- .../github/se/assocify/AssociationAPITest.kt | 2 - .../se/assocify/AssociationUtilsTest.kt | 83 ++++++++++++------- 2 files changed, 54 insertions(+), 31 deletions(-) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationAPITest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationAPITest.kt index 1ee18cca2..013ffbbc3 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationAPITest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationAPITest.kt @@ -74,7 +74,6 @@ class AssociationAPITest { @Test fun testAddAssociation() { - Mockito.`when`(db.collection(Mockito.any())).thenReturn(collectionReference) Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) .thenReturn(documentReference) @@ -87,7 +86,6 @@ class AssociationAPITest { @Test fun testDeleteAssociation() { - Mockito.`when`(db.collection(Mockito.any())).thenReturn(collectionReference) Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) .thenReturn(documentReference) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt index e5d70213e..2eee13608 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt @@ -2,7 +2,6 @@ package com.github.se.assocify import com.github.se.assocify.model.associations.AssociationUtils import com.github.se.assocify.model.database.AssociationAPI -import com.github.se.assocify.model.database.FirebaseApi import com.github.se.assocify.model.entities.Association import com.github.se.assocify.model.entities.Role import com.github.se.assocify.model.entities.User @@ -13,42 +12,49 @@ import com.google.firebase.firestore.DocumentSnapshot import com.google.firebase.firestore.FirebaseFirestore import org.junit.Before import org.junit.Test -import org.mockito.Mock -import org.mockito.MockMakers import org.mockito.Mockito import org.mockito.Mockito.mock class AssociationUtilsTest { - private lateinit var db: FirebaseFirestore + private lateinit var db: FirebaseFirestore private lateinit var assoApi: AssociationAPI - private val documentSnapshot = Mockito.mock(DocumentSnapshot::class.java) - private val documentReference = Mockito.mock(DocumentReference::class.java) - private val collectionReference = Mockito.mock(CollectionReference::class.java) - private val president = User("testId", "Carlo", Role("president")) - private val newUser = User() - val oldAsso = - Association( - "aId", - "cassify", - "a cool association", - "31/09/2005", - "active", - listOf(president), - emptyList()) - val oldAssoUpdated = - Association( - "aId", - "cassify", - "a cool association", - "31/09/2005", - "active", - listOf(president, newUser), - emptyList()) + private val documentSnapshot = Mockito.mock(DocumentSnapshot::class.java) + private val documentReference = Mockito.mock(DocumentReference::class.java) + private val collectionReference = Mockito.mock(CollectionReference::class.java) + private val president = User("testId", "Carlo", Role("president")) + private val newUser = User() + val oldAsso = + Association( + "aId", + "cassify", + "a cool association", + "31/09/2005", + "active", + listOf(president), + emptyList()) + val oldAssoUpdated = + Association( + "aId", + "cassify", + "a cool association", + "31/09/2005", + "active", + listOf(president, newUser), + emptyList()) + val oldAssoReviewed = + Association( + "aId", + "cassify", + "a cool association", + "31/09/2005", + "active", + listOf(president, User("", "", Role("newRole"))), + emptyList()) @Before fun setup() { db = Mockito.mock(FirebaseFirestore::class.java) - assoApi = AssociationAPI(db) + assoApi = AssociationAPI(db) } @Test @@ -62,7 +68,26 @@ class AssociationUtilsTest { } @Test - fun checkCreateWorks() { + fun checkAcceptNewUser() { + Mockito.`when`(documentSnapshot.exists()).thenReturn(true) + Mockito.`when`(documentSnapshot.toObject(Association::class.java)).thenReturn(oldAssoUpdated) + Mockito.`when`(documentReference.get()).thenReturn(Tasks.forResult(documentSnapshot)) + val task = Tasks.forResult(documentSnapshot) + Mockito.`when`(db.collection(Mockito.any())).thenReturn(Mockito.mock()) + Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) + .thenReturn(documentReference) + val assocUtilsUpdated = AssociationUtils(president, oldAssoUpdated.uid, assoApi) + val pendingUsers = assocUtilsUpdated.getPendingUsers() + assert(pendingUsers == listOf(newUser)) + + Mockito.`when`(db.collection(Mockito.any())).thenReturn(collectionReference) + Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) + .thenReturn(documentReference) + Mockito.`when`(documentReference.set(Mockito.any())).thenReturn(Tasks.forResult(null)) + + assocUtilsUpdated.acceptNewUser(newUser.uid, "newRole") + Mockito.verify(db.collection(assoApi.collectionName).document(oldAssoUpdated.uid)) + .set(oldAssoReviewed) } } From 290dd09853f189aa1bc5668a81d83a0b47024c94 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 8 Apr 2024 20:06:38 +0200 Subject: [PATCH 25/32] test: added the requestToBeAdded test --- .../se/assocify/AssociationUtilsTest.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt index 2eee13608..a47a72d69 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt @@ -90,4 +90,25 @@ class AssociationUtilsTest { Mockito.verify(db.collection(assoApi.collectionName).document(oldAssoUpdated.uid)) .set(oldAssoReviewed) } + + @Test + fun checkRequestAssocEntry() { + Mockito.`when`(documentSnapshot.exists()).thenReturn(true) + Mockito.`when`(documentSnapshot.toObject(Association::class.java)).thenReturn(oldAsso) + Mockito.`when`(documentReference.get()).thenReturn(Tasks.forResult(documentSnapshot)) + + val task = Tasks.forResult(documentSnapshot) + Mockito.`when`(db.collection(Mockito.any())).thenReturn(Mockito.mock()) + Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) + .thenReturn(documentReference) + val newUserUtils = AssociationUtils(newUser, oldAsso.uid, assoApi) + + Mockito.`when`(db.collection(Mockito.any())).thenReturn(collectionReference) + Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) + .thenReturn(documentReference) + Mockito.`when`(documentReference.set(Mockito.any())).thenReturn(Tasks.forResult(null)) + newUserUtils.requestAssociationAccess() + Mockito.verify(db.collection(assoApi.collectionName).document(oldAssoUpdated.uid)) + .set(oldAssoUpdated) + } } From 967030fdbc1262d25ddae24843ad6d3570d09e34 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Tue, 9 Apr 2024 01:15:35 +0200 Subject: [PATCH 26/32] test: added the createAssociation test --- .../se/assocify/AssociationUtilsTest.kt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt index a47a72d69..c8078b38d 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt @@ -107,8 +107,31 @@ class AssociationUtilsTest { Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) .thenReturn(documentReference) Mockito.`when`(documentReference.set(Mockito.any())).thenReturn(Tasks.forResult(null)) + newUserUtils.requestAssociationAccess() Mockito.verify(db.collection(assoApi.collectionName).document(oldAssoUpdated.uid)) .set(oldAssoUpdated) } + + @Test + fun checkCreateNewAssociation() { + Mockito.`when`(db.collection(Mockito.any())).thenReturn(collectionReference) + Mockito.`when`(db.collection(Mockito.any()).document()).thenReturn(documentReference) + Mockito.`when`(documentReference.id).thenReturn("testId") + Mockito.`when`(documentReference.set(Mockito.any())).thenReturn(Tasks.forResult(null)) + + val newAssoUtils = AssociationUtils(president, associationDatabase = assoApi) + val name = "pollify" + val description = "a small association to have fun" + val creationDate = "12/06/1987" + val status = "open" + val newAsso = + Association("testId", name, description, creationDate, status, emptyList(), emptyList()) + + Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) + .thenReturn(documentReference) + Mockito.`when`(documentReference.set(Mockito.any())).thenReturn(Tasks.forResult(null)) + newAssoUtils.createNewAssoc(name, description, creationDate, status, emptyList(), emptyList()) + Mockito.verify(db.collection(assoApi.collectionName).document(newAsso.uid)).set(newAsso) + } } From 85678f0c7d1a5e462a17f0016fc5105bf64a0e6d Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Tue, 9 Apr 2024 01:25:02 +0200 Subject: [PATCH 27/32] test: added a corrrection to the createAssociation test --- .../java/com/github/se/assocify/AssociationUtilsTest.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt index c8078b38d..d835465ed 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt @@ -132,6 +132,8 @@ class AssociationUtilsTest { .thenReturn(documentReference) Mockito.`when`(documentReference.set(Mockito.any())).thenReturn(Tasks.forResult(null)) newAssoUtils.createNewAssoc(name, description, creationDate, status, emptyList(), emptyList()) + assert(newAssoUtils.getAssocId() == "testId") + assert(newAssoUtils.getAssociationDescription() == "a small association to have fun") Mockito.verify(db.collection(assoApi.collectionName).document(newAsso.uid)).set(newAsso) } } From 11d2644e588d840ca10377e1b105f230dab6f0f2 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Tue, 9 Apr 2024 02:02:02 +0200 Subject: [PATCH 28/32] test: added a getter test --- .../se/assocify/AssociationUtilsTest.kt | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt index d835465ed..a73f0745b 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt @@ -3,6 +3,7 @@ package com.github.se.assocify import com.github.se.assocify.model.associations.AssociationUtils import com.github.se.assocify.model.database.AssociationAPI import com.github.se.assocify.model.entities.Association +import com.github.se.assocify.model.entities.Event import com.github.se.assocify.model.entities.Role import com.github.se.assocify.model.entities.User import com.google.android.gms.tasks.Tasks @@ -50,6 +51,23 @@ class AssociationUtilsTest { "active", listOf(president, User("", "", Role("newRole"))), emptyList()) + val u1 = User("a", "1", Role("president")) + val u2 = User("b", "2", Role("user")) + val u3 = User("c", "3", Role("user")) + val u4 = User("d", "4", Role("pending")) + val u5 = User("e", "5", Role("pending")) + val e1 = Event("s1", "e1", emptyList(), emptyList()) + val e2 = Event("s2", "e2", emptyList(), emptyList()) + val e3 = Event("s3", "e3", emptyList(), emptyList()) + val getterAsso = + Association( + "getId", + "gettify", + "association to test the getters", + "31/09/2005", + "active", + listOf(u1, u2, u3, u4, u5), + listOf(e1, e2, e3)) @Before fun setup() { @@ -97,7 +115,6 @@ class AssociationUtilsTest { Mockito.`when`(documentSnapshot.toObject(Association::class.java)).thenReturn(oldAsso) Mockito.`when`(documentReference.get()).thenReturn(Tasks.forResult(documentSnapshot)) - val task = Tasks.forResult(documentSnapshot) Mockito.`when`(db.collection(Mockito.any())).thenReturn(Mockito.mock()) Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) .thenReturn(documentReference) @@ -136,4 +153,25 @@ class AssociationUtilsTest { assert(newAssoUtils.getAssociationDescription() == "a small association to have fun") Mockito.verify(db.collection(assoApi.collectionName).document(newAsso.uid)).set(newAsso) } + + @Test + fun checkGetters() { + Mockito.`when`(documentSnapshot.exists()).thenReturn(true) + Mockito.`when`(documentSnapshot.toObject(Association::class.java)).thenReturn(getterAsso) + Mockito.`when`(documentReference.get()).thenReturn(Tasks.forResult(documentSnapshot)) + + Mockito.`when`(db.collection(Mockito.any())).thenReturn(Mockito.mock()) + Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) + .thenReturn(documentReference) + + val getterUtil = AssociationUtils(newUser, "getId", assoApi) + assert(getterUtil.getAllUsers() == listOf(u1, u2, u3, u4, u5)) + assert(getterUtil.getAssociationDescription() == "association to test the getters") + assert(getterUtil.getAssocId() == "getId") + assert(getterUtil.getPendingUsers() == listOf(u4, u5)) + assert(getterUtil.getRecordedUsers() == listOf(u1, u2, u3)) + assert(getterUtil.getEvents() == listOf(e1, e2, e3)) + assert(getterUtil.getCreationDate() == "31/09/2005") + assert(getterUtil.getAssociationName() == "gettify") + } } From 7d756536fe9c481970126319ba7f559a5b163134 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Tue, 9 Apr 2024 11:25:15 +0200 Subject: [PATCH 29/32] fix: removed unused import --- app/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 46405c03b..db3fbb218 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -127,7 +127,6 @@ dependencies { implementation("com.squareup.okhttp3:okhttp:3.14.9") androidTestImplementation("org.mockito:mockito-android:5.11.0") - testImplementation ("org.mockito:mockito-inline:3.11.2") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2") // Roboelectric From 6f59c381b9c59aa8a93a69522f99530be953f9fd Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Tue, 9 Apr 2024 11:26:51 +0200 Subject: [PATCH 30/32] fix: cleaned the tests --- .../java/com/github/se/assocify/AssociationUtilsTest.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt index a73f0745b..86f17913a 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt @@ -71,7 +71,7 @@ class AssociationUtilsTest { @Before fun setup() { - db = Mockito.mock(FirebaseFirestore::class.java) + db = mock(FirebaseFirestore::class.java) assoApi = AssociationAPI(db) } @@ -91,7 +91,6 @@ class AssociationUtilsTest { Mockito.`when`(documentSnapshot.toObject(Association::class.java)).thenReturn(oldAssoUpdated) Mockito.`when`(documentReference.get()).thenReturn(Tasks.forResult(documentSnapshot)) - val task = Tasks.forResult(documentSnapshot) Mockito.`when`(db.collection(Mockito.any())).thenReturn(Mockito.mock()) Mockito.`when`(db.collection(Mockito.any()).document(Mockito.any())) .thenReturn(documentReference) From 6e8deab47e311064699cc4381bd9f568ce494c42 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Tue, 9 Apr 2024 11:45:55 +0200 Subject: [PATCH 31/32] fix: cleaned what remained of the viewModel --- .../se/assocify/AssociationUtilsTest.kt | 6 +-- .../model/associations/AssociationUtils.kt | 48 +++++++++---------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt index 86f17913a..02b052ceb 100644 --- a/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt +++ b/app/src/androidTest/java/com/github/se/assocify/AssociationUtilsTest.kt @@ -19,9 +19,9 @@ import org.mockito.Mockito.mock class AssociationUtilsTest { private lateinit var db: FirebaseFirestore private lateinit var assoApi: AssociationAPI - private val documentSnapshot = Mockito.mock(DocumentSnapshot::class.java) - private val documentReference = Mockito.mock(DocumentReference::class.java) - private val collectionReference = Mockito.mock(CollectionReference::class.java) + private val documentSnapshot = mock(DocumentSnapshot::class.java) + private val documentReference = mock(DocumentReference::class.java) + private val collectionReference = mock(CollectionReference::class.java) private val president = User("testId", "Carlo", Role("president")) private val newUser = User() val oldAsso = diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt index 0e78bbdd1..98782cadb 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt @@ -12,15 +12,15 @@ class AssociationUtils( private var user: User, private var assocId: String = "", private val associationDatabase: AssociationAPI -) : ViewModel() { - private val _associationState: MutableStateFlow = MutableStateFlow(null) +){ + private var _associationState: Association? = null init { update() } fun update() { - if (assocId != "") _associationState.value = associationDatabase.getAssociation(assocId) + if (assocId != "") _associationState = associationDatabase.getAssociation(assocId) } fun getAssocId(): String { @@ -29,56 +29,56 @@ class AssociationUtils( fun getPendingUsers(): List { update() - if (_associationState.value == null) { + if (_associationState == null) { return emptyList() } - return _associationState.value!!.members.filter { x -> x.role == Role("pending") } + return _associationState!!.members.filter { x -> x.role == Role("pending") } } fun getRecordedUsers(): List { update() - if (_associationState.value == null) { + if (_associationState == null) { return emptyList() } - return _associationState.value!!.members.filter { x -> x.role != Role("pending") } + return _associationState!!.members.filter { x -> x.role != Role("pending") } } fun getAllUsers(): List { update() - if (_associationState.value == null) { + if (_associationState == null) { return emptyList() } - return _associationState.value!!.members + return _associationState!!.members } fun getAssociationName(): String { - if (_associationState.value == null) return "" - return _associationState.value!!.name + if (_associationState == null) return "" + return _associationState!!.name } fun getAssociationDescription(): String { - if (_associationState.value == null) return "" - return _associationState.value!!.description + if (_associationState == null) return "" + return _associationState!!.description } fun getCreationDate(): String { - if (_associationState.value == null) return "" - return _associationState.value!!.creationDate + if (_associationState == null) return "" + return _associationState!!.creationDate } fun getEvents(): List { - if (_associationState.value == null) return emptyList() - return _associationState.value!!.events + if (_associationState == null) return emptyList() + return _associationState!!.events } fun acceptNewUser(uid: String, role: String) { - if (_associationState.value != null && + if (_associationState != null && (user.role == Role("president") || user.role == Role("co-president"))) { val userList = getPendingUsers().filter { u -> u.uid == uid } if (userList.isEmpty()) return val user = userList[0] val updatedUser = User(uid, user.name, Role(role)) - val ass = _associationState.value!! + val ass = _associationState!! val updatedAssoc = Association( ass.uid, @@ -93,8 +93,8 @@ class AssociationUtils( } fun requestAssociationAccess() { - if (_associationState.value != null) { - val ass = _associationState.value!! + if (_associationState != null) { + val ass = _associationState!! val updatedAssoc = Association( ass.uid, @@ -120,7 +120,7 @@ class AssociationUtils( val assoc = Association(uid, name, description, creationDate, status, members, events) associationDatabase.addAssociation(assoc) assocId = uid - _associationState.value = assoc + _associationState = assoc return assoc } @@ -128,11 +128,11 @@ class AssociationUtils( if (user.role != Role("president")) return associationDatabase.deleteAssociation(assocId) assocId = "" - _associationState.value = null + _associationState = null } fun getAllAssociations(): List { - if (_associationState.value == null) return emptyList() + if (_associationState == null) return emptyList() return associationDatabase.getAssociations() } From 0873f080d9310409ca08a2bd3768aef44e1290e2 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Tue, 9 Apr 2024 11:54:32 +0200 Subject: [PATCH 32/32] style: ktfmt --- .../github/se/assocify/model/associations/AssociationUtils.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt b/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt index 98782cadb..664f773c6 100644 --- a/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt +++ b/app/src/main/java/com/github/se/assocify/model/associations/AssociationUtils.kt @@ -1,18 +1,16 @@ package com.github.se.assocify.model.associations -import androidx.lifecycle.ViewModel import com.github.se.assocify.model.database.AssociationAPI import com.github.se.assocify.model.entities.Association import com.github.se.assocify.model.entities.Event import com.github.se.assocify.model.entities.Role import com.github.se.assocify.model.entities.User -import kotlinx.coroutines.flow.MutableStateFlow class AssociationUtils( private var user: User, private var assocId: String = "", private val associationDatabase: AssociationAPI -){ +) { private var _associationState: Association? = null init {