@@ -7,14 +7,42 @@ import {
77 createFileSync ,
88 pathExistsSync ,
99} from "fs-extra" ;
10- import { Uri } from "vscode" ;
10+ import { CancellationTokenSource , Uri , window } from "vscode" ;
11+
12+ import type {
13+ DatabaseImportQuickPickItems ,
14+ DatabaseQuickPickItem ,
15+ DatabaseSelectionQuickPickItem ,
16+ } from "../../../../src/databases/local-databases-ui" ;
1117
1218import { DatabaseUI } from "../../../../src/databases/local-databases-ui" ;
1319import { testDisposeHandler } from "../../test-dispose-handler" ;
1420import { createMockApp } from "../../../__mocks__/appMock" ;
1521import { QueryLanguage } from "../../../../src/common/query-language" ;
22+ import { mockedQuickPickItem , mockedObject } from "../../utils/mocking.helpers" ;
1623
1724describe ( "local-databases-ui" , ( ) => {
25+ const storageDir = dirSync ( { unsafeCleanup : true } ) . name ;
26+ const db1 = createDatabase ( storageDir , "db1-imported" , QueryLanguage . Cpp ) ;
27+ const db2 = createDatabase ( storageDir , "db2-notimported" , QueryLanguage . Cpp ) ;
28+ const db3 = createDatabase ( storageDir , "db3-invalidlanguage" , "hucairz" ) ;
29+
30+ // these two should be deleted
31+ const db4 = createDatabase (
32+ storageDir ,
33+ "db2-notimported-with-db-info" ,
34+ QueryLanguage . Cpp ,
35+ ".dbinfo" ,
36+ ) ;
37+ const db5 = createDatabase (
38+ storageDir ,
39+ "db2-notimported-with-codeql-database.yml" ,
40+ QueryLanguage . Cpp ,
41+ "codeql-database.yml" ,
42+ ) ;
43+
44+ const app = createMockApp ( { } ) ;
45+
1846 describe ( "fixDbUri" , ( ) => {
1947 const fixDbUri = ( DatabaseUI . prototype as any ) . fixDbUri ;
2048 it ( "should choose current directory normally" , async ( ) => {
@@ -64,30 +92,6 @@ describe("local-databases-ui", () => {
6492 } ) ;
6593
6694 it ( "should delete orphaned databases" , async ( ) => {
67- const storageDir = dirSync ( { unsafeCleanup : true } ) . name ;
68- const db1 = createDatabase ( storageDir , "db1-imported" , QueryLanguage . Cpp ) ;
69- const db2 = createDatabase (
70- storageDir ,
71- "db2-notimported" ,
72- QueryLanguage . Cpp ,
73- ) ;
74- const db3 = createDatabase ( storageDir , "db3-invalidlanguage" , "hucairz" ) ;
75-
76- // these two should be deleted
77- const db4 = createDatabase (
78- storageDir ,
79- "db2-notimported-with-db-info" ,
80- QueryLanguage . Cpp ,
81- ".dbinfo" ,
82- ) ;
83- const db5 = createDatabase (
84- storageDir ,
85- "db2-notimported-with-codeql-database.yml" ,
86- QueryLanguage . Cpp ,
87- "codeql-database.yml" ,
88- ) ;
89-
90- const app = createMockApp ( { } ) ;
9195 const databaseUI = new DatabaseUI (
9296 app ,
9397 {
@@ -98,6 +102,7 @@ describe("local-databases-ui", () => {
98102 onDidChangeCurrentDatabaseItem : ( ) => {
99103 /**/
100104 } ,
105+ setCurrentDatabaseItem : ( ) => { } ,
101106 } as any ,
102107 {
103108 onLanguageContextChanged : ( ) => {
@@ -108,7 +113,6 @@ describe("local-databases-ui", () => {
108113 storageDir ,
109114 storageDir ,
110115 ) ;
111-
112116 await databaseUI . handleRemoveOrphanedDatabases ( ) ;
113117
114118 expect ( pathExistsSync ( db1 ) ) . toBe ( true ) ;
@@ -121,6 +125,130 @@ describe("local-databases-ui", () => {
121125 databaseUI . dispose ( testDisposeHandler ) ;
122126 } ) ;
123127
128+ describe ( "getDatabaseItem" , ( ) => {
129+ const progress = jest . fn ( ) ;
130+ const token = new CancellationTokenSource ( ) . token ;
131+ describe ( "when there is a current database" , ( ) => {
132+ const databaseUI = new DatabaseUI (
133+ app ,
134+ {
135+ databaseItems : [ { databaseUri : Uri . file ( db1 ) } ] ,
136+ onDidChangeDatabaseItem : ( ) => {
137+ /**/
138+ } ,
139+ onDidChangeCurrentDatabaseItem : ( ) => {
140+ /**/
141+ } ,
142+ setCurrentDatabaseItem : ( ) => { } ,
143+ currentDatabaseItem : { databaseUri : Uri . file ( db1 ) } ,
144+ } as any ,
145+ {
146+ onLanguageContextChanged : ( ) => {
147+ /**/
148+ } ,
149+ } as any ,
150+ { } as any ,
151+ storageDir ,
152+ storageDir ,
153+ ) ;
154+
155+ it ( "should return current database" , async ( ) => {
156+ const databaseItem = await databaseUI . getDatabaseItem ( progress , token ) ;
157+
158+ expect ( databaseItem ) . toEqual ( { databaseUri : Uri . file ( db1 ) } ) ;
159+ } ) ;
160+ } ) ;
161+
162+ describe ( "when there is no current database" , ( ) => {
163+ const databaseManager = {
164+ databaseItems : [
165+ { databaseUri : Uri . file ( db1 ) } ,
166+ { databaseUri : Uri . file ( db2 ) } ,
167+ ] ,
168+ onDidChangeDatabaseItem : ( ) => {
169+ /**/
170+ } ,
171+ onDidChangeCurrentDatabaseItem : ( ) => {
172+ /**/
173+ } ,
174+ setCurrentDatabaseItem : ( ) => { } ,
175+ currentDatabaseItem : undefined ,
176+ } as any ;
177+
178+ const databaseUI = new DatabaseUI (
179+ app ,
180+ databaseManager ,
181+ {
182+ onLanguageContextChanged : ( ) => {
183+ /**/
184+ } ,
185+ } as any ,
186+ { } as any ,
187+ storageDir ,
188+ storageDir ,
189+ ) ;
190+
191+ it ( "should prompt for a database and select existing one" , async ( ) => {
192+ const showQuickPickSpy = jest
193+ . spyOn ( window , "showQuickPick" )
194+ . mockResolvedValueOnce (
195+ mockedQuickPickItem (
196+ mockedObject < DatabaseSelectionQuickPickItem > ( {
197+ databaseKind : "existing" ,
198+ } ) ,
199+ ) ,
200+ )
201+ . mockResolvedValueOnce (
202+ mockedQuickPickItem (
203+ mockedObject < DatabaseQuickPickItem > ( {
204+ databaseItem : { databaseUri : Uri . file ( db2 ) } ,
205+ } ) ,
206+ ) ,
207+ ) ;
208+
209+ const setCurrentDatabaseItemSpy = jest . spyOn (
210+ databaseManager ,
211+ "setCurrentDatabaseItem" ,
212+ ) ;
213+
214+ await databaseUI . getDatabaseItem ( progress , token ) ;
215+
216+ expect ( showQuickPickSpy ) . toHaveBeenCalledTimes ( 2 ) ;
217+ expect ( setCurrentDatabaseItemSpy ) . toHaveBeenCalledWith ( {
218+ databaseUri : Uri . file ( db2 ) ,
219+ } ) ;
220+ } ) ;
221+
222+ it ( "should prompt for a database and import a new one" , async ( ) => {
223+ const showQuickPickSpy = jest
224+ . spyOn ( window , "showQuickPick" )
225+ . mockResolvedValueOnce (
226+ mockedQuickPickItem (
227+ mockedObject < DatabaseSelectionQuickPickItem > ( {
228+ databaseKind : "new" ,
229+ } ) ,
230+ ) ,
231+ )
232+ . mockResolvedValueOnce (
233+ mockedQuickPickItem (
234+ mockedObject < DatabaseImportQuickPickItems > ( {
235+ importType : "github" ,
236+ } ) ,
237+ ) ,
238+ ) ;
239+
240+ const handleChooseDatabaseGithubSpy = jest
241+ . spyOn ( databaseUI as any , "handleChooseDatabaseGithub" )
242+ . mockResolvedValue ( undefined ) ;
243+
244+ await databaseUI . getDatabaseItem ( progress , token ) ;
245+
246+ expect ( showQuickPickSpy ) . toHaveBeenCalledTimes ( 2 ) ;
247+ expect ( handleChooseDatabaseGithubSpy ) . toHaveBeenCalledTimes ( 1 ) ;
248+ } ) ;
249+ } ) ;
250+ } ) ;
251+
124252 function createDatabase (
125253 storageDir : string ,
126254 dbName : string ,
0 commit comments