@@ -28,8 +28,12 @@ import io.kotest.matchers.shouldBe
2828import org.eclipse.apoapsis.ortserver.dao.UniqueConstraintException
2929import org.eclipse.apoapsis.ortserver.dao.test.DatabaseTestExtension
3030import org.eclipse.apoapsis.ortserver.dao.test.Fixtures
31+ import org.eclipse.apoapsis.ortserver.model.CompoundHierarchyId
32+ import org.eclipse.apoapsis.ortserver.model.OrganizationId
3133import org.eclipse.apoapsis.ortserver.model.Product
34+ import org.eclipse.apoapsis.ortserver.model.ProductId
3235import org.eclipse.apoapsis.ortserver.model.util.FilterParameter
36+ import org.eclipse.apoapsis.ortserver.model.util.HierarchyFilter
3337import org.eclipse.apoapsis.ortserver.model.util.ListQueryParameters
3438import org.eclipse.apoapsis.ortserver.model.util.ListQueryResult
3539import org.eclipse.apoapsis.ortserver.model.util.OrderDirection
@@ -112,7 +116,7 @@ class DaoProductRepositoryTest : StringSpec({
112116 fixtures.createProduct("product-gateway")
113117 fixtures.createProduct("core-service")
114118
115- productRepository.list(filter = FilterParameter ("product$")) shouldBe ListQueryResult (
119+ productRepository.list(nameFilter = FilterParameter ("product$")) shouldBe ListQueryResult (
116120 data = listOf(
117121 Product (prod1.id, orgId, prod1.name, prod1.description),
118122 Product (prod2.id, orgId, prod2.name, prod2.description)
@@ -128,7 +132,126 @@ class DaoProductRepositoryTest : StringSpec({
128132 fixtures.createProduct("user-product")
129133 fixtures.createProduct("name")
130134
131- productRepository.list(filter = FilterParameter ("^product")) shouldBe ListQueryResult (
135+ productRepository.list(nameFilter = FilterParameter ("^product")) shouldBe ListQueryResult (
136+ data = listOf(
137+ Product (prod1.id, orgId, prod1.name, prod1.description),
138+ Product (prod2.id, orgId, prod2.name, prod2.description)
139+ ),
140+ params = ListQueryParameters .DEFAULT ,
141+ totalCount = 2
142+ )
143+ }
144+
145+ " list should apply a hierarchy filter on product level" {
146+ val prod1 = fixtures.createProduct("prod1")
147+ val prod1Id = CompoundHierarchyId .forProduct(
148+ OrganizationId (fixtures.organization.id),
149+ ProductId (prod1.id)
150+ )
151+ val prod2 = fixtures.createProduct("prod2")
152+ val prod2Id = CompoundHierarchyId .forProduct(
153+ OrganizationId (fixtures.organization.id),
154+ ProductId (prod2.id)
155+ )
156+ fixtures.createProduct("prod3")
157+
158+ val hierarchyFilter = HierarchyFilter (
159+ transitiveIncludes = mapOf(CompoundHierarchyId .PRODUCT_LEVEL to listOf(prod1Id, prod2Id)),
160+ nonTransitiveIncludes = emptyMap(),
161+ excludes = emptyMap()
162+ )
163+ val result = productRepository.list(hierarchyFilter = hierarchyFilter)
164+
165+ result shouldBe ListQueryResult (
166+ data = listOf(
167+ Product (prod1.id, orgId, prod1.name, prod1.description),
168+ Product (prod2.id, orgId, prod2.name, prod2.description)
169+ ),
170+ params = ListQueryParameters .DEFAULT ,
171+ totalCount = 2
172+ )
173+ }
174+
175+ " list should apply a hierarchy filter on organization level" {
176+ val org2 = fixtures.createOrganization(name = "org2")
177+ val org1Id = CompoundHierarchyId .forOrganization(OrganizationId (fixtures.organization.id))
178+ val org2Id = CompoundHierarchyId .forOrganization(OrganizationId (org2.id))
179+
180+ val prod1 = fixtures.createProduct("prod1")
181+ val prod2 = fixtures.createProduct("prod2", organizationId = org2.id)
182+
183+ val otherOrg = fixtures.createOrganization(name = "otherOrg")
184+ fixtures.createProduct("prod3", organizationId = otherOrg.id)
185+
186+ val hierarchyFilter = HierarchyFilter (
187+ transitiveIncludes = mapOf(CompoundHierarchyId .ORGANIZATION_LEVEL to listOf(org1Id, org2Id)),
188+ nonTransitiveIncludes = emptyMap(),
189+ excludes = emptyMap()
190+ )
191+ val result = productRepository.list(hierarchyFilter = hierarchyFilter)
192+
193+ result shouldBe ListQueryResult (
194+ data = listOf(
195+ Product (prod1.id, orgId, prod1.name, prod1.description),
196+ Product (prod2.id, org2.id, prod2.name, prod2.description)
197+ ),
198+ params = ListQueryParameters .DEFAULT ,
199+ totalCount = 2
200+ )
201+ }
202+
203+ " list should apply a hierarchy filter on organization level with excludes" {
204+ val org2 = fixtures.createOrganization(name = "org2")
205+ val org1Id = CompoundHierarchyId .forOrganization(OrganizationId (fixtures.organization.id))
206+ val org2Id = CompoundHierarchyId .forOrganization(OrganizationId (org2.id))
207+
208+ val prod1 = fixtures.createProduct("prod1")
209+ val prod2 = fixtures.createProduct("prod2", organizationId = org2.id)
210+ val prod2Id = CompoundHierarchyId .forProduct(
211+ OrganizationId (org2.id),
212+ ProductId (prod2.id)
213+ )
214+
215+ val otherOrg = fixtures.createOrganization(name = "otherOrg")
216+ fixtures.createProduct("prod3", organizationId = otherOrg.id)
217+
218+ val hierarchyFilter = HierarchyFilter (
219+ transitiveIncludes = mapOf(CompoundHierarchyId .ORGANIZATION_LEVEL to listOf(org1Id, org2Id)),
220+ nonTransitiveIncludes = emptyMap(),
221+ excludes = mapOf(CompoundHierarchyId .PRODUCT_LEVEL to listOf(prod2Id))
222+ )
223+ val result = productRepository.list(hierarchyFilter = hierarchyFilter)
224+
225+ result shouldBe ListQueryResult (
226+ data = listOf(
227+ Product (prod1.id, orgId, prod1.name, prod1.description)
228+ ),
229+ params = ListQueryParameters .DEFAULT ,
230+ totalCount = 1
231+ )
232+ }
233+
234+ " list should apply a filter with non-transitive includes" {
235+ val prod1 = fixtures.createProduct("prod1")
236+ val prod1Id = CompoundHierarchyId .forProduct(
237+ OrganizationId (fixtures.organization.id),
238+ ProductId (prod1.id)
239+ )
240+ val prod2 = fixtures.createProduct("prod2")
241+ val prod2Id = CompoundHierarchyId .forProduct(
242+ OrganizationId (fixtures.organization.id),
243+ ProductId (prod2.id)
244+ )
245+ fixtures.createProduct("prod3")
246+
247+ val hierarchyFilter = HierarchyFilter (
248+ transitiveIncludes = mapOf(CompoundHierarchyId .PRODUCT_LEVEL to listOf(prod1Id)),
249+ nonTransitiveIncludes = mapOf(CompoundHierarchyId .PRODUCT_LEVEL to listOf(prod2Id)),
250+ excludes = emptyMap()
251+ )
252+ val result = productRepository.list(hierarchyFilter = hierarchyFilter)
253+
254+ result shouldBe ListQueryResult (
132255 data = listOf(
133256 Product (prod1.id, orgId, prod1.name, prod1.description),
134257 Product (prod2.id, orgId, prod2.name, prod2.description)
0 commit comments