@@ -206,4 +206,267 @@ class Alice {
206206 end
207207 end
208208 end
209+
210+ describe '#resolve' do
211+ it 'should return the original request if it is not understood' do
212+ resolve_request = {
213+ 'label' => 'spec-test-label' ,
214+ 'kind' => LanguageServer ::COMPLETIONITEMKIND_TEXT ,
215+ 'detail' => 'spec-test-detail' ,
216+ 'data' => { 'type' => 'unknown_type' }
217+ }
218+
219+ result = subject . resolve ( resolve_request )
220+ expect ( result ) . to eq ( resolve_request )
221+ end
222+
223+ context 'when resolving a variable_expr_fact request' do
224+ let ( :content ) { <<-EOT
225+ $test = $facts[
226+ EOT
227+ }
228+ let ( :line_num ) { 0 }
229+ let ( :char_num ) { 17 }
230+
231+ before ( :each ) do
232+ # Generate the resolution request based on a completion response
233+ @completion_response = subject . complete ( content , line_num , char_num )
234+ end
235+
236+ context 'for a well known fact (operatingsystem)' do
237+ before ( :each ) do
238+ @resolve_request = @completion_response [ "items" ] . find do |item |
239+ item [ "label" ] == 'operatingsystem' && item [ "kind" ] == LanguageServer ::COMPLETIONITEMKIND_VARIABLE
240+ end
241+ raise RuntimeError , "operatingsystem fact could not be found" if @resolve_request . nil?
242+ end
243+
244+ it 'should return the fact value' do
245+ result = subject . resolve ( @resolve_request )
246+ expect ( result [ 'documentation' ] ) . to eq ( Facter . fact ( 'operatingsystem' ) . value )
247+ end
248+ end
249+
250+ context 'for a fact that does not exist' do
251+ it 'should return empty string' do
252+ resolve_request = {
253+ 'label' => 'spec-test-label' ,
254+ 'kind' => LanguageServer ::COMPLETIONITEMKIND_TEXT ,
255+ 'detail' => 'spec-test-detail' ,
256+ 'data' => { 'type' => 'variable_expr_fact' , 'expr' => 'I_dont_exist' }
257+ }
258+
259+ result = subject . resolve ( resolve_request )
260+
261+ expect ( result [ 'documentation' ] ) . to eq ( '' )
262+ end
263+ end
264+ end
265+
266+ context 'when resolving a keyword request' do
267+ let ( :content ) { <<-EOT
268+ class Alice {
269+ }
270+ EOT
271+ }
272+ let ( :line_num ) { 0 }
273+ let ( :char_num ) { 0 }
274+
275+ before ( :each ) do
276+ # Generate the resolution request based on a completion response
277+ @completion_response = subject . complete ( content , line_num , char_num )
278+ end
279+
280+ %w[ class define ] . each do |testcase |
281+ context "for #{ testcase } " do
282+ before ( :each ) do
283+ @resolve_request = @completion_response [ "items" ] . find do |item |
284+ item [ "label" ] == testcase && item [ "kind" ] == LanguageServer ::COMPLETIONITEMKIND_KEYWORD
285+ end
286+ raise RuntimeError , "A #{ testcase } keyword response could not be found" if @resolve_request . nil?
287+ end
288+
289+ it 'should return the documentation' do
290+ result = subject . resolve ( @resolve_request )
291+ expect ( result [ 'documentation' ] ) . to match ( /.+/ )
292+ end
293+
294+ it 'should return a text snippet' do
295+ result = subject . resolve ( @resolve_request )
296+ expect ( result [ 'insertText' ] ) . to match ( /.+/ )
297+ expect ( result [ 'insertTextFormat' ] ) . to eq ( LanguageServer ::INSERTTEXTFORMAT_SNIPPET )
298+ end
299+ end
300+ end
301+
302+ %w[ application site ] . each do |testcase |
303+ context "for #{ testcase } " do
304+ before ( :each ) do
305+ @resolve_request = @completion_response [ "items" ] . find do |item |
306+ item [ "label" ] == testcase && item [ "kind" ] == LanguageServer ::COMPLETIONITEMKIND_KEYWORD
307+ end
308+ raise RuntimeError , "A #{ testcase } keyword response could not be found" if @resolve_request . nil?
309+ end
310+
311+ it 'should return the documentation' do
312+ result = subject . resolve ( @resolve_request )
313+ expect ( result [ 'documentation' ] ) . to match ( /.+/ )
314+ end
315+
316+ it 'should return Orchestrator detail' do
317+ result = subject . resolve ( @resolve_request )
318+ expect ( result [ 'detail' ] ) . to eq ( 'Orchestrator' )
319+ end
320+
321+ it 'should return a text snippet' do
322+ result = subject . resolve ( @resolve_request )
323+ expect ( result [ 'insertText' ] ) . to match ( /.+/ )
324+ expect ( result [ 'insertTextFormat' ] ) . to eq ( LanguageServer ::INSERTTEXTFORMAT_SNIPPET )
325+ end
326+ end
327+ end
328+ end
329+
330+ context 'when resolving a function request' do
331+ let ( :content ) { <<-EOT
332+ class Alice {
333+ }
334+ EOT
335+ }
336+ let ( :line_num ) { 0 }
337+ let ( :char_num ) { 0 }
338+
339+ before ( :each ) do
340+ # Generate the resolution request based on a completion response
341+ @completion_response = subject . complete ( content , line_num , char_num )
342+ end
343+
344+ context 'for a well known function (alert)' do
345+ before ( :each ) do
346+ @resolve_request = @completion_response [ "items" ] . find do |item |
347+ item [ "label" ] == 'alert' && item [ "kind" ] == LanguageServer ::COMPLETIONITEMKIND_FUNCTION
348+ end
349+ raise RuntimeError , "alert function could not be found" if @resolve_request . nil?
350+ end
351+
352+ it 'should return the documentation' do
353+ result = subject . resolve ( @resolve_request )
354+ expect ( result [ 'documentation' ] ) . to match ( /.+/ )
355+ end
356+
357+ it 'should return a text snippet' do
358+ result = subject . resolve ( @resolve_request )
359+ expect ( result [ 'insertText' ] ) . to match ( /.+/ )
360+ expect ( result [ 'insertTextFormat' ] ) . to eq ( LanguageServer ::INSERTTEXTFORMAT_SNIPPET )
361+ end
362+ end
363+ end
364+
365+ context 'when resolving a resource_type request' do
366+ let ( :content ) { <<-EOT
367+ class Alice {
368+ }
369+ EOT
370+ }
371+ let ( :line_num ) { 0 }
372+ let ( :char_num ) { 0 }
373+
374+ before ( :each ) do
375+ # Generate the resolution request based on a completion response
376+ @completion_response = subject . complete ( content , line_num , char_num )
377+ end
378+
379+ context 'for a well known puppet type (user)' do
380+ before ( :each ) do
381+ @resolve_request = @completion_response [ "items" ] . find do |item |
382+ item [ "label" ] == 'user' && item [ "kind" ] == LanguageServer ::COMPLETIONITEMKIND_MODULE
383+ end
384+ raise RuntimeError , "user type could not be found" if @resolve_request . nil?
385+ end
386+
387+ it 'should return the documentation' do
388+ result = subject . resolve ( @resolve_request )
389+ expect ( result [ 'documentation' ] ) . to match ( /.+/ )
390+ end
391+
392+ it 'should return a text snippet' do
393+ result = subject . resolve ( @resolve_request )
394+ expect ( result [ 'insertText' ] ) . to match ( /.+/ )
395+ expect ( result [ 'insertTextFormat' ] ) . to eq ( LanguageServer ::INSERTTEXTFORMAT_SNIPPET )
396+ end
397+ end
398+ end
399+
400+ context 'when resolving a resource_parameter request' do
401+ let ( :content ) { <<-EOT
402+ user { 'Alice':
403+
404+ }
405+ EOT
406+ }
407+ let ( :line_num ) { 1 }
408+ let ( :char_num ) { 0 }
409+
410+ before ( :each ) do
411+ # Generate the resolution request based on a completion response
412+ @completion_response = subject . complete ( content , line_num , char_num )
413+ end
414+
415+ context 'for the name parameter of a well known puppet type (user)' do
416+ before ( :each ) do
417+ @resolve_request = @completion_response [ "items" ] . find do |item |
418+ item [ "label" ] == 'name' && item [ "kind" ] == LanguageServer ::COMPLETIONITEMKIND_PROPERTY
419+ end
420+ raise RuntimeError , "name parameter could not be found" if @resolve_request . nil?
421+ end
422+
423+ it 'should return the documentation' do
424+ result = subject . resolve ( @resolve_request )
425+ expect ( result [ 'documentation' ] ) . to match ( /.+/ )
426+ end
427+
428+ it 'should return a text literal with the parameter defintion' do
429+ result = subject . resolve ( @resolve_request )
430+ expect ( result [ 'insertText' ] ) . to match ( /.+ => / )
431+ expect ( result [ 'insertTextFormat' ] ) . to be_nil
432+ end
433+ end
434+ end
435+
436+ context 'when resolving a resource_property request' do
437+ let ( :content ) { <<-EOT
438+ user { 'Alice':
439+
440+ }
441+ EOT
442+ }
443+ let ( :line_num ) { 1 }
444+ let ( :char_num ) { 0 }
445+
446+ before ( :each ) do
447+ # Generate the resolution request based on a completion response
448+ @completion_response = subject . complete ( content , line_num , char_num )
449+ end
450+
451+ context 'for the ensure property of a well known puppet type (user)' do
452+ before ( :each ) do
453+ @resolve_request = @completion_response [ "items" ] . find do |item |
454+ item [ "label" ] == 'ensure' && item [ "kind" ] == LanguageServer ::COMPLETIONITEMKIND_PROPERTY
455+ end
456+ raise RuntimeError , "ensure property could not be found" if @resolve_request . nil?
457+ end
458+
459+ it 'should return the documentation' do
460+ result = subject . resolve ( @resolve_request )
461+ expect ( result [ 'documentation' ] ) . to match ( /.+/ )
462+ end
463+
464+ it 'should return a text literal with the property defintion' do
465+ result = subject . resolve ( @resolve_request )
466+ expect ( result [ 'insertText' ] ) . to match ( /.+ => / )
467+ expect ( result [ 'insertTextFormat' ] ) . to be_nil
468+ end
469+ end
470+ end
471+ end
209472end
0 commit comments