@@ -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,92 @@ 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+ )
162+ val result = productRepository.list(hierarchyFilter = hierarchyFilter)
163+
164+ result shouldBe ListQueryResult (
165+ data = listOf(
166+ Product (prod1.id, orgId, prod1.name, prod1.description),
167+ Product (prod2.id, orgId, prod2.name, prod2.description)
168+ ),
169+ params = ListQueryParameters .DEFAULT ,
170+ totalCount = 2
171+ )
172+ }
173+
174+ " list should apply a hierarchy filter on organization level" {
175+ val org2 = fixtures.createOrganization(name = "org2")
176+ val org1Id = CompoundHierarchyId .forOrganization(OrganizationId (fixtures.organization.id))
177+ val org2Id = CompoundHierarchyId .forOrganization(OrganizationId (org2.id))
178+
179+ val prod1 = fixtures.createProduct("prod1")
180+ val prod2 = fixtures.createProduct("prod2", organizationId = org2.id)
181+
182+ val otherOrg = fixtures.createOrganization(name = "otherOrg")
183+ fixtures.createProduct("prod3", organizationId = otherOrg.id)
184+
185+ val hierarchyFilter = HierarchyFilter (
186+ transitiveIncludes = mapOf(CompoundHierarchyId .ORGANIZATION_LEVEL to listOf(org1Id, org2Id)),
187+ nonTransitiveIncludes = emptyMap(),
188+ )
189+ val result = productRepository.list(hierarchyFilter = hierarchyFilter)
190+
191+ result shouldBe ListQueryResult (
192+ data = listOf(
193+ Product (prod1.id, orgId, prod1.name, prod1.description),
194+ Product (prod2.id, org2.id, prod2.name, prod2.description)
195+ ),
196+ params = ListQueryParameters .DEFAULT ,
197+ totalCount = 2
198+ )
199+ }
200+
201+ " list should apply a filter with non-transitive includes" {
202+ val prod1 = fixtures.createProduct("prod1")
203+ val prod1Id = CompoundHierarchyId .forProduct(
204+ OrganizationId (fixtures.organization.id),
205+ ProductId (prod1.id)
206+ )
207+ val prod2 = fixtures.createProduct("prod2")
208+ val prod2Id = CompoundHierarchyId .forProduct(
209+ OrganizationId (fixtures.organization.id),
210+ ProductId (prod2.id)
211+ )
212+ fixtures.createProduct("prod3")
213+
214+ val hierarchyFilter = HierarchyFilter (
215+ transitiveIncludes = mapOf(CompoundHierarchyId .PRODUCT_LEVEL to listOf(prod1Id)),
216+ nonTransitiveIncludes = mapOf(CompoundHierarchyId .PRODUCT_LEVEL to listOf(prod2Id)),
217+ )
218+ val result = productRepository.list(hierarchyFilter = hierarchyFilter)
219+
220+ result shouldBe ListQueryResult (
132221 data = listOf(
133222 Product (prod1.id, orgId, prod1.name, prod1.description),
134223 Product (prod2.id, orgId, prod2.name, prod2.description)
0 commit comments