Skip to content

Commit df05a14

Browse files
authored
Merge pull request #234 from glennsarti/add-more-completion-tests
(maint) Add site keyword and completion tests
2 parents df8b144 + 658b334 commit df05a14

File tree

2 files changed

+264
-1
lines changed

2 files changed

+264
-1
lines changed

server/lib/puppet-languageserver/completion_provider.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def self.complete(content, line_num, char_num)
1010
# We are in the root of the document.
1111

1212
# Add keywords
13-
keywords(%w[class define application]) { |x| items << x }
13+
keywords(%w[class define application site]) { |x| items << x }
1414

1515
# Add resources
1616
all_resources { |x| items << x }

server/spec/languageserver/integration/puppet-languageserver/completion_provider_spec.rb

Lines changed: 263 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
209472
end

0 commit comments

Comments
 (0)