@@ -207,7 +207,7 @@ describe('DatasetService', () => {
207207 ) ;
208208 } ) ;
209209
210- test ( 'saveDataset creates and saves a new dataset' , async ( ) => {
210+ test ( 'saveDataset creates and saves a new dataset without data source ' , async ( ) => {
211211 const mockDataset = {
212212 id : 'test-dataset' ,
213213 title : 'Test Dataset' ,
@@ -216,10 +216,15 @@ describe('DatasetService', () => {
216216 type : mockType . id ,
217217 timeFieldName : 'timestamp' ,
218218 schemaMappings : { otelLogs : { spanId : 'span.id' } } ,
219+ // No dataSource property
219220 } as Dataset ;
220221
222+ const mockCreatedDataView = {
223+ id : 'generated-uuid-1234' ,
224+ } ;
225+
221226 const mockDataViews = {
222- createAndSave : jest . fn ( ) . mockResolvedValue ( { } ) ,
227+ createAndSave : jest . fn ( ) . mockResolvedValue ( mockCreatedDataView ) ,
223228 } ;
224229
225230 const servicesWithDataViews = {
@@ -233,19 +238,84 @@ describe('DatasetService', () => {
233238 service . registerType ( mockType ) ;
234239 await service . saveDataset ( mockDataset , servicesWithDataViews , 'metrics' ) ;
235240
241+ // Should call createAndSave without the ID to allow UUID generation
236242 expect ( mockDataViews . createAndSave ) . toHaveBeenCalledWith (
237243 expect . objectContaining ( {
238- id : 'test-dataset' ,
244+ id : undefined , // Should be undefined for datasets without data source
245+ title : 'Test Dataset' ,
246+ displayName : 'My Dataset' ,
247+ description : 'Test description' ,
248+ timeFieldName : 'timestamp' ,
249+ signalType : 'metrics' ,
250+ schemaMappings : { otelLogs : { spanId : 'span.id' } } ,
251+ } ) ,
252+ undefined ,
253+ false
254+ ) ;
255+
256+ // Should update the dataset with the generated UUID
257+ expect ( mockDataset . id ) . toBe ( 'generated-uuid-1234' ) ;
258+ } ) ;
259+
260+ test ( 'saveDataset creates and saves a new dataset with data source' , async ( ) => {
261+ const mockDataset = {
262+ id : 'test-dataset' ,
263+ title : 'Test Dataset' ,
264+ displayName : 'My Dataset' ,
265+ description : 'Test description' ,
266+ type : mockType . id ,
267+ timeFieldName : 'timestamp' ,
268+ schemaMappings : { otelLogs : { spanId : 'span.id' } } ,
269+ dataSource : {
270+ id : 'data-source-123' ,
271+ title : 'My Data Source' ,
272+ type : 'OpenSearch' ,
273+ version : '1.0' ,
274+ } ,
275+ } as Dataset ;
276+
277+ const mockCreatedDataView = {
278+ id : 'data-source-123::generated-uuid-5678' ,
279+ } ;
280+
281+ const mockDataViews = {
282+ createAndSave : jest . fn ( ) . mockResolvedValue ( mockCreatedDataView ) ,
283+ } ;
284+
285+ const servicesWithDataViews = {
286+ ...mockDataPluginServices ,
287+ data : {
288+ ...dataPluginMock . createStartContract ( ) ,
289+ dataViews : mockDataViews as any ,
290+ } ,
291+ } ;
292+
293+ service . registerType ( mockType ) ;
294+ await service . saveDataset ( mockDataset , servicesWithDataViews , 'metrics' ) ;
295+
296+ // Should call createAndSave with data source prefixed ID
297+ expect ( mockDataViews . createAndSave ) . toHaveBeenCalledWith (
298+ expect . objectContaining ( {
299+ id : expect . stringMatching ( / ^ d a t a - s o u r c e - 1 2 3 : : [ 0 - 9 a - f - ] { 36 } $ / ) , // Should match data-source-id::uuid pattern
239300 title : 'Test Dataset' ,
240301 displayName : 'My Dataset' ,
241302 description : 'Test description' ,
242303 timeFieldName : 'timestamp' ,
243304 signalType : 'metrics' ,
244305 schemaMappings : { otelLogs : { spanId : 'span.id' } } ,
306+ dataSourceRef : {
307+ id : 'data-source-123' ,
308+ name : 'My Data Source' ,
309+ type : 'OpenSearch' ,
310+ version : '1.0' ,
311+ } ,
245312 } ) ,
246313 undefined ,
247314 false
248315 ) ;
316+
317+ // Should update the dataset with the generated UUID
318+ expect ( mockDataset . id ) . toBe ( 'data-source-123::generated-uuid-5678' ) ;
249319 } ) ;
250320
251321 test ( 'saveDataset does not save index pattern datasets' , async ( ) => {
@@ -489,5 +559,59 @@ describe('DatasetService', () => {
489559 'Failed to save dataset'
490560 ) ;
491561 } ) ;
562+
563+ test ( 'does not update dataset ID when createAndSave returns undefined' , async ( ) => {
564+ const originalId = 'test-dataset' ;
565+ const mockDataset = {
566+ id : originalId ,
567+ title : 'Test Dataset' ,
568+ type : mockType . id ,
569+ } as Dataset ;
570+
571+ const mockDataViews = {
572+ createAndSave : jest . fn ( ) . mockResolvedValue ( undefined ) ,
573+ } ;
574+
575+ const servicesWithDataViews = {
576+ ...mockDataPluginServices ,
577+ data : {
578+ ...dataPluginMock . createStartContract ( ) ,
579+ dataViews : mockDataViews as any ,
580+ } ,
581+ } ;
582+
583+ service . registerType ( mockType ) ;
584+ await service . saveDataset ( mockDataset , servicesWithDataViews ) ;
585+
586+ // Dataset ID should remain unchanged when no ID is returned
587+ expect ( mockDataset . id ) . toBe ( originalId ) ;
588+ } ) ;
589+
590+ test ( 'does not update dataset ID when createAndSave returns object without ID' , async ( ) => {
591+ const originalId = 'test-dataset' ;
592+ const mockDataset = {
593+ id : originalId ,
594+ title : 'Test Dataset' ,
595+ type : mockType . id ,
596+ } as Dataset ;
597+
598+ const mockDataViews = {
599+ createAndSave : jest . fn ( ) . mockResolvedValue ( { } ) ,
600+ } ;
601+
602+ const servicesWithDataViews = {
603+ ...mockDataPluginServices ,
604+ data : {
605+ ...dataPluginMock . createStartContract ( ) ,
606+ dataViews : mockDataViews as any ,
607+ } ,
608+ } ;
609+
610+ service . registerType ( mockType ) ;
611+ await service . saveDataset ( mockDataset , servicesWithDataViews ) ;
612+
613+ // Dataset ID should remain unchanged when no ID is returned
614+ expect ( mockDataset . id ) . toBe ( originalId ) ;
615+ } ) ;
492616 } ) ;
493617} ) ;
0 commit comments