@@ -59,14 +59,82 @@ func TestInit(t *testing.T) {
5959
6060func TestExtract (t * testing.T ) {
6161 t .Run ("should extract grafana metadata into meta dashboard" , func (t * testing.T ) {
62- expected := []* meteorv1beta1.Entity {
62+ ctx := context .TODO ()
63+ extractor := grafana .New (utils .Logger )
64+ err := extractor .Init (ctx , plugins.Config {
65+ URNScope : urnScope ,
66+ RawConfig : map [string ]any {
67+ "base_url" : testServer .URL ,
68+ "api_key" : "qwerty123" ,
69+ },
70+ })
71+ if err != nil {
72+ t .Fatal (err )
73+ }
74+
75+ emitter := mocks .NewEmitter ()
76+ err = extractor .Extract (ctx , emitter .Push )
77+ assert .NoError (t , err )
78+
79+ actual := emitter .GetAllEntities ()
80+
81+ // Datasources come from map iteration (non-deterministic order),
82+ // so collect them by URN for comparison.
83+ dsByURN := make (map [string ]* meteorv1beta1.Entity )
84+ var dashboards []* meteorv1beta1.Entity
85+ for _ , e := range actual {
86+ if e .Type == "datasource" {
87+ dsByURN [e .Urn ] = e
88+ } else {
89+ dashboards = append (dashboards , e )
90+ }
91+ }
92+
93+ // Verify datasource entities.
94+ assert .Len (t , dsByURN , 2 )
95+ expectedDatasources := map [string ]* meteorv1beta1.Entity {
96+ "urn:grafana:test-grafana:datasource:Dkd9hvWnz" : models .NewEntity (
97+ "urn:grafana:test-grafana:datasource:Dkd9hvWnz" ,
98+ "datasource" ,
99+ "PostgreSQL" ,
100+ "grafana" ,
101+ map [string ]any {
102+ "type" : "postgres" ,
103+ "url" : "host.docker.internal:5432" ,
104+ "database" : "random" ,
105+ },
106+ ),
107+ "urn:grafana:test-grafana:datasource:Pa4J0vZnk" : models .NewEntity (
108+ "urn:grafana:test-grafana:datasource:Pa4J0vZnk" ,
109+ "datasource" ,
110+ "PostgreSQL-1" ,
111+ "grafana" ,
112+ map [string ]any {
113+ "type" : "postgres" ,
114+ "url" : "host.docker.internal:5432" ,
115+ "database" : "random" ,
116+ },
117+ ),
118+ }
119+ for urn , expectedDS := range expectedDatasources {
120+ actualDS , ok := dsByURN [urn ]
121+ if assert .True (t , ok , "missing datasource %s" , urn ) {
122+ utils .AssertEqualProto (t , expectedDS , actualDS )
123+ }
124+ }
125+
126+ // Verify dashboard entities (these are emitted in deterministic order).
127+ expectedDashboards := []* meteorv1beta1.Entity {
63128 models .NewEntity (
64129 "urn:grafana:test-grafana:dashboard:HzK8qNW7z" ,
65130 "dashboard" ,
66131 "new-dashboard-copy" ,
67132 "grafana" ,
68133 map [string ]any {
69- "url" : fmt .Sprintf ("%s/d/HzK8qNW7z/new-dashboard-copy" , testServer .URL ),
134+ "url" : fmt .Sprintf ("%s/d/HzK8qNW7z/new-dashboard-copy" , testServer .URL ),
135+ "folder" : "General" ,
136+ "created_by" : "admin" ,
137+ "updated_by" : "admin" ,
70138 "charts" : []any {
71139 map [string ]any {
72140 "urn" : "urn:grafana:test-grafana:panel:HzK8qNW7z.2" ,
@@ -88,6 +156,10 @@ func TestExtract(t *testing.T) {
88156 map [string ]any {
89157 "url" : fmt .Sprintf ("%s/d/5WsKOvW7z/test-dashboard-updated" , testServer .URL ),
90158 "description" : "this is description for testing" ,
159+ "folder" : "testing-testing" ,
160+ "created_by" : "admin" ,
161+ "updated_by" : "admin" ,
162+ "tags" : []any {"test" , "dev" },
91163 "charts" : []any {
92164 map [string ]any {
93165 "urn" : "urn:grafana:test-grafana:panel:5WsKOvW7z.4" ,
@@ -114,25 +186,7 @@ func TestExtract(t *testing.T) {
114186 },
115187 ),
116188 }
117-
118- ctx := context .TODO ()
119- extractor := grafana .New (utils .Logger )
120- err := extractor .Init (ctx , plugins.Config {
121- URNScope : urnScope ,
122- RawConfig : map [string ]any {
123- "base_url" : testServer .URL ,
124- "api_key" : "qwerty123" ,
125- },
126- })
127- if err != nil {
128- t .Fatal (err )
129- }
130-
131- emitter := mocks .NewEmitter ()
132- err = extractor .Extract (ctx , emitter .Push )
133-
134- assert .NoError (t , err )
135- utils .AssertEqualProtos (t , expected , emitter .GetAllEntities ())
189+ utils .AssertEqualProtos (t , expectedDashboards , dashboards )
136190 })
137191}
138192
0 commit comments