From cd063d2ab273956af9613f7d6ebb46b6a5250b5c Mon Sep 17 00:00:00 2001 From: Wouter Remijn Date: Fri, 6 Jun 2025 15:05:37 +0200 Subject: [PATCH] fix toplayer conversion --- api/v2beta1/wms_conversion.go | 17 ++- api/v2beta1/wms_conversion_test.go | 209 +++++++++++++++++++++++++++++ 2 files changed, 220 insertions(+), 6 deletions(-) diff --git a/api/v2beta1/wms_conversion.go b/api/v2beta1/wms_conversion.go index 9f04f0b..44177fd 100644 --- a/api/v2beta1/wms_conversion.go +++ b/api/v2beta1/wms_conversion.go @@ -340,12 +340,17 @@ func (v2Service WMSService) MapLayersToV3() pdoknlv3.Layer { // if a topLayer is defined in the v2 it be the only layer without a group // and there are other layers that have the topLayer as their group - // so if there is exactly 1 layer without a group - // and the name of that layer exist as a key in the map of Groups: layer in that group - // then that layer must be the topLayer + // and at least one of those layers is itself a group layer var topLayer *pdoknlv3.Layer - if len(notGroupedLayers) == 1 { - _, ok := groupedLayers[*notGroupedLayers[0].Name] + if _, ok := groupedLayers[*notGroupedLayers[0].Name]; ok && len(notGroupedLayers) == 1 { + subLayers := groupedLayers[*notGroupedLayers[0].Name] + ok := false + for _, layer := range subLayers { + if _, ok = groupedLayers[*layer.Name]; ok { + break + } + } + if ok { topLayer = ¬GroupedLayers[0] } @@ -413,7 +418,7 @@ func (v2Layer WMSLayer) MapToV3(v2Service WMSService) pdoknlv3.Layer { Keywords: v2Layer.Keywords, LabelNoClip: v2Layer.LabelNoClip, Styles: []pdoknlv3.Style{}, - Layers: []pdoknlv3.Layer{}, + Layers: nil, BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, MinScaleDenominator: nil, MaxScaleDenominator: nil, diff --git a/api/v2beta1/wms_conversion_test.go b/api/v2beta1/wms_conversion_test.go index 79f0436..5df430c 100644 --- a/api/v2beta1/wms_conversion_test.go +++ b/api/v2beta1/wms_conversion_test.go @@ -3,6 +3,9 @@ package v2beta1 import ( "testing" + "github.com/google/go-cmp/cmp" + "k8s.io/utils/ptr" + pdoknlv3 "github.com/pdok/mapserver-operator/api/v3" "github.com/stretchr/testify/assert" "sigs.k8s.io/yaml" @@ -21,3 +24,209 @@ func TestV2ToV3(t *testing.T) { a := 0 _ = a } + +func TestWMSService_MapLayersToV3(t *testing.T) { + tests := []struct { + name string + v2Service WMSService + want pdoknlv3.Layer + }{ + { + name: "no toplayer, middle: 1 data layer", + v2Service: WMSService{Layers: []WMSLayer{ + {Name: "layer"}, + }}, + want: pdoknlv3.Layer{ + Title: ptr.To(""), + Abstract: ptr.To(""), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Layers: []pdoknlv3.Layer{{ + Name: ptr.To("layer"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + }}, + }, + }, + { + name: "no toplayer, middle: 1 group layer", + v2Service: WMSService{Layers: []WMSLayer{ + {Name: "group-layer"}, + {Name: "sub-layer", Group: ptr.To("group-layer")}, + }}, + want: pdoknlv3.Layer{ + Title: ptr.To(""), + Abstract: ptr.To(""), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Layers: []pdoknlv3.Layer{{ + Name: ptr.To("group-layer"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + Layers: []pdoknlv3.Layer{ + { + Name: ptr.To("sub-layer"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + }, + }, + }}, + }, + }, + { + name: "no toplayer, middle: 2 group layers", + v2Service: WMSService{Layers: []WMSLayer{ + {Name: "group-layer-1"}, + {Name: "sub-layer-1", Group: ptr.To("group-layer-1")}, + {Name: "group-layer-2"}, + {Name: "sub-layer-2", Group: ptr.To("group-layer-2")}, + }}, + want: pdoknlv3.Layer{ + Title: ptr.To(""), + Abstract: ptr.To(""), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Layers: []pdoknlv3.Layer{ + { + Name: ptr.To("group-layer-1"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + Layers: []pdoknlv3.Layer{ + { + Name: ptr.To("sub-layer-1"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + }, + }, + }, + { + Name: ptr.To("group-layer-2"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + Layers: []pdoknlv3.Layer{ + { + Name: ptr.To("sub-layer-2"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + }, + }, + }, + }, + }, + }, + { + name: "no toplayer, middle: 1 group layer, 1 data layer", + v2Service: WMSService{Layers: []WMSLayer{ + {Name: "group-layer"}, + {Name: "sub-layer", Group: ptr.To("group-layer")}, + {Name: "data-layer"}, + }}, + want: pdoknlv3.Layer{ + Title: ptr.To(""), + Abstract: ptr.To(""), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Layers: []pdoknlv3.Layer{ + { + Name: ptr.To("group-layer"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + Layers: []pdoknlv3.Layer{ + { + Name: ptr.To("sub-layer"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + }, + }, + }, + { + Name: ptr.To("data-layer"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + }, + }, + }, + }, + { + name: "toplayer, middle: 1 group layer", + v2Service: WMSService{Layers: []WMSLayer{ + {Name: "group-layer", Group: ptr.To("top-layer")}, + {Name: "sub-layer", Group: ptr.To("group-layer")}, + {Name: "top-layer"}, + }}, + want: pdoknlv3.Layer{ + Name: ptr.To("top-layer"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + Layers: []pdoknlv3.Layer{{ + Name: ptr.To("group-layer"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + Layers: []pdoknlv3.Layer{ + { + Name: ptr.To("sub-layer"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + }, + }, + }}, + }, + }, + { + name: "toplayer, middle: 1 group layer, 1 data layer", + v2Service: WMSService{Layers: []WMSLayer{ + {Name: "group-layer", Group: ptr.To("top-layer")}, + {Name: "sub-layer", Group: ptr.To("group-layer")}, + {Name: "top-layer"}, + {Name: "data-layer", Group: ptr.To("top-layer")}, + }}, + want: pdoknlv3.Layer{ + Name: ptr.To("top-layer"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + Layers: []pdoknlv3.Layer{ + { + Name: ptr.To("group-layer"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + Layers: []pdoknlv3.Layer{ + { + Name: ptr.To("sub-layer"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + }, + }, + }, + { + Name: ptr.To("data-layer"), + BoundingBoxes: []pdoknlv3.WMSBoundingBox{}, + Visible: true, + Styles: []pdoknlv3.Style{}, + }, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + diff := cmp.Diff(tt.want, tt.v2Service.MapLayersToV3()) + assert.Equal(t, diff == "", true, "%s", diff) + }) + } +}