Skip to content

Commit

Permalink
Add integration test for add-on
Browse files Browse the repository at this point in the history
  • Loading branch information
andyw8 committed Jan 8, 2025
1 parent 4ad2080 commit 336e04d
Show file tree
Hide file tree
Showing 10 changed files with 113 additions and 1 deletion.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
/coverage/
/doc/
/pkg/
/spec/dummy/log/
/spec/dummy/tmp/
/spec/examples.txt
/spec/reports/
/tmp/
Expand Down
1 change: 1 addition & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ Sorbet/TrueSigil:
- "**/*.rake"
Exclude:
- "lib/ruby_lsp/tapioca/server_addon.rb"
- "spec/dummy/**/*.rb"

Style/CaseEquality:
Enabled: false
Expand Down
8 changes: 8 additions & 0 deletions sorbet/rbi/shims/minitest.rbi
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# typed: true

# Can be removed once https://github.com/Shopify/rbi-central/pull/300 ships

class Minitest::HooksSpec
sig { params(arg: Symbol, block: T.proc.bind(T.attached_class).void).void }
def self.after(arg, &block); end
end
6 changes: 6 additions & 0 deletions spec/dummy/app/jobs/notify_user_job.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# frozen_string_literal: true

class NotifyUserJob < ActiveJob::Base
def perform(user)
end
end
14 changes: 14 additions & 0 deletions spec/dummy/bin/rails
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env ruby
# frozen_string_literal: true

# This command will automatically be run when you run "rails" with Rails gems
# installed from the root of your application.

ENGINE_ROOT = File.expand_path("..", __dir__)
APP_PATH = File.expand_path("../config/application", __dir__)

# Set up gems listed in the Gemfile.
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"])

require "rails/engine/commands"
7 changes: 7 additions & 0 deletions spec/dummy/config.ru
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# typed: strict
# frozen_string_literal: true

require_relative "config/environment"

run Rails.application
Rails.application.load_server
16 changes: 16 additions & 0 deletions spec/dummy/config/application.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# frozen_string_literal: true

ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../../Gemfile", __dir__)

require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"])
$LOAD_PATH.unshift(File.expand_path("../../../lib", __dir__))

require "rails" # minimal, instead of "rails/all"
require "active_job/railtie"

Bundler.require(*Rails.groups)

module Dummy
class Application < Rails::Application
end
end
5 changes: 5 additions & 0 deletions spec/dummy/config/environment.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# frozen_string_literal: true

require_relative "application"

Rails.application.initialize!
2 changes: 1 addition & 1 deletion spec/spec_with_project.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class SpecWithProject < Minitest::HooksSpec

# Spec lifecycle

# TODO: Replace by `before(:all)` once Sorbet understands it
# TODO: Replace with `before(:all)` once Sorbet understands it
sig { params(args: T.untyped).void }
def initialize(*args)
super(*T.unsafe(args))
Expand Down
53 changes: 53 additions & 0 deletions spec/tapioca/addon_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# typed: true
# frozen_string_literal: true

require "spec_helper"
require "language_server-protocol"
require "ruby_lsp/utils"
require "ruby_lsp/ruby_lsp_rails/runner_client"
require "minitest/hooks"

module RubyLsp
module Tapioca
class AddonSpec < Minitest::HooksSpec
# The approach here is based on tests within the Ruby LSP Rails gem

# TODO: Replace with `before(:all)` once Sorbet understands it
def initialize(*args)
super(*T.unsafe(args))
@outgoing_queue = Thread::Queue.new
@client = T.let(nil, T.nilable(RubyLsp::Rails::RunnerClient))
FileUtils.chdir("spec/dummy") do
@client = RubyLsp::Rails::RunnerClient.new(@outgoing_queue)
end
end

after(:all) do
T.must(@client).shutdown

assert_predicate(@client, :stopped?)
@outgoing_queue.close
end

it "generates DSL RBIs for a given constant" do
addon_path = File.expand_path("lib/ruby_lsp/tapioca/server_addon.rb")
T.must(@client).register_server_addon(File.expand_path(addon_path))
T.must(@client).delegate_notification(
server_addon_name: "Tapioca",
request_name: "dsl",
constants: ["NotifyUserJob"],
)

begin
Timeout.timeout(10) do
sleep(1) until File.exist?("spec/dummy/sorbet/rbi/dsl/notify_user_job.rbi")
end
rescue Timeout::Error
flunk("RBI file was not generated")
end
ensure
FileUtils.rm_rf("spec/dummy/sorbet/rbi")
end
end
end
end

0 comments on commit 336e04d

Please sign in to comment.