11import uniqueId from 'lodash/uniqueId' ;
22
3- import { IEventBus , URI } from '@opensumi/ide-core-browser' ;
3+ import { IEventBus , SaveTaskResponseState , URI } from '@opensumi/ide-core-browser' ;
44import { IHashCalculateService } from '@opensumi/ide-core-common/lib/hash-calculate/hash-calculate' ;
55import { EmptyDocCacheImpl } from '@opensumi/ide-editor/lib/browser/doc-cache' ;
66import { monacoApi } from '@opensumi/ide-monaco/lib/browser/monaco-api' ;
77import { EOL } from '@opensumi/ide-monaco/lib/browser/monaco-api/types' ;
8+ import { IMessageService } from '@opensumi/ide-overlay' ;
89import { isLinux , isMacintosh } from '@opensumi/monaco-editor-core/esm/vs/base/common/platform' ;
910
1011import { createBrowserInjector } from '../../../../../tools/dev-tool/src/injector-helper' ;
@@ -14,8 +15,11 @@ import { EditorDocumentModel, EditorDocumentModelConstructionOptions } from '../
1415import {
1516 EditorDocumentModelContentChangedEvent ,
1617 EditorDocumentModelOptionChangedEvent ,
18+ EditorDocumentModelSaveErrorEvent ,
19+ IEditorDocumentModelContentRegistry ,
20+ IEditorDocumentModelService ,
1721} from '../../../src/browser/doc-model/types' ;
18- import { IDocPersistentCacheProvider } from '../../../src/common' ;
22+ import { IDocPersistentCacheProvider , SaveReason } from '../../../src/common' ;
1923
2024describe ( 'EditorDocumentModel' , ( ) => {
2125 let injector : MockInjector ;
@@ -209,4 +213,54 @@ describe('EditorDocumentModel', () => {
209213 expect ( docModelAny . _tryAutoSaveAfterDelay ) . toBeUndefined ( ) ;
210214 } ) ;
211215 } ) ;
216+
217+ describe ( 'save' , ( ) => {
218+ let uri : URI ;
219+ let docModel : EditorDocumentModel ;
220+ let saveEditorDocumentModel : jest . Mock ;
221+ let eventBus : IEventBus ;
222+ let saveErrorListener : jest . Mock ;
223+ let saveErrorDisposer : { dispose ( ) : void } ;
224+
225+ beforeEach ( ( ) => {
226+ uri = new URI ( `test://save/${ Math . random ( ) } ` ) ;
227+ eventBus = injector . get ( IEventBus ) ;
228+ injector . mockService ( IEditorDocumentModelContentRegistry , {
229+ getProvider : jest . fn ( ) . mockResolvedValue ( {
230+ isReadonly : jest . fn ( ) . mockResolvedValue ( false ) ,
231+ } ) ,
232+ } ) ;
233+ injector . mockService ( IMessageService , {
234+ error : jest . fn ( ) ,
235+ } ) ;
236+ saveEditorDocumentModel = jest . fn ( ) . mockResolvedValue ( {
237+ state : SaveTaskResponseState . ERROR ,
238+ errorMessage : 'save failed' ,
239+ } ) ;
240+ injector . mockService ( IEditorDocumentModelService , {
241+ saveEditorDocumentModel,
242+ } ) ;
243+ docModel = injector . get ( EditorDocumentModel , [ uri , 'original content' , { savable : true } ] ) ;
244+ saveErrorListener = jest . fn ( ) ;
245+ saveErrorDisposer = eventBus . on ( EditorDocumentModelSaveErrorEvent , saveErrorListener ) ;
246+ } ) ;
247+
248+ afterEach ( ( ) => {
249+ saveErrorDisposer . dispose ( ) ;
250+ docModel . dispose ( ) ;
251+ } ) ;
252+
253+ it ( 'should emit save error event when saving fails' , async ( ) => {
254+ docModel . getMonacoModel ( ) . setValue ( 'updated content' ) ;
255+
256+ const result = await docModel . save ( false , SaveReason . AfterDelay ) ;
257+
258+ expect ( result ) . toBe ( false ) ;
259+ expect ( saveEditorDocumentModel ) . toHaveBeenCalledTimes ( 1 ) ;
260+ expect ( saveErrorListener ) . toHaveBeenCalledTimes ( 1 ) ;
261+ const event = saveErrorListener . mock . calls [ 0 ] [ 0 ] ;
262+ expect ( event . payload . uri . toString ( ) ) . toBe ( uri . toString ( ) ) ;
263+ expect ( event . payload . errorMessage ) . toBe ( 'save failed' ) ;
264+ } ) ;
265+ } ) ;
212266} ) ;
0 commit comments