quorum 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/Gemfile.lock +82 -74
  2. data/HISTORY.md +9 -0
  3. data/README.rdoc +101 -23
  4. data/app/assets/javascripts/quorum/jobs.js +45 -3
  5. data/app/controllers/quorum/jobs_controller.rb +47 -2
  6. data/app/models/quorum/job.rb +52 -9
  7. data/app/views/quorum/jobs/new.html.erb +7 -6
  8. data/app/views/quorum/jobs/show.html.erb +7 -118
  9. data/app/views/quorum/jobs/templates/_blast_detailed_report_template.html.erb +53 -0
  10. data/app/views/quorum/jobs/templates/_blast_template.html.erb +68 -0
  11. data/config/routes.rb +2 -0
  12. data/db/migrate/20120109232446_add_hit_display_id_to_blast_reports.rb +8 -0
  13. data/lib/generators/quorum/images_generator.rb +18 -0
  14. data/lib/generators/quorum/install_generator.rb +41 -13
  15. data/lib/generators/templates/README +1 -1
  16. data/lib/generators/templates/blast.rb +18 -7
  17. data/lib/generators/templates/blast_db.rb +106 -0
  18. data/lib/generators/templates/fetch +115 -0
  19. data/lib/generators/templates/quorum_initializer.rb +1 -1
  20. data/lib/generators/templates/quorum_settings.yml +4 -4
  21. data/lib/quorum/helpers.rb +71 -1
  22. data/lib/quorum/version.rb +1 -1
  23. data/lib/quorum.rb +15 -5
  24. data/lib/workers/quorum.rb +12 -2
  25. data/quorum.gemspec +4 -2
  26. data/spec/data/seqs_not_fa.txt +16 -16
  27. data/spec/dummy/config/initializers/quorum_initializer.rb +1 -1
  28. data/spec/dummy/config/initializers/resque.rb +4 -1
  29. data/spec/dummy/config/quorum_settings.yml +4 -4
  30. data/spec/dummy/db/schema.rb +8 -1
  31. data/spec/dummy/quorum/bin/fetch +115 -0
  32. data/spec/dummy/quorum/blastdb/test.nin +0 -0
  33. data/spec/dummy/quorum/blastdb/test.pin +0 -0
  34. data/spec/dummy/quorum/lib/fetch_tools/blast_db.rb +106 -0
  35. data/spec/dummy/quorum/lib/search_tools/blast.rb +18 -7
  36. data/spec/models/job_spec.rb +3 -4
  37. data/spec/quorum_installed_spec.rb +5 -0
  38. data/spec/requests/jobs_spec.rb +14 -1
  39. data/spec/spec_helper.rb +32 -1
  40. data/spec/support/streams.rb +16 -0
  41. data/spec/templates/blast_db_spec.rb +63 -0
  42. data/spec/templates/blast_spec.rb +108 -2
  43. metadata +64 -37
  44. /data/app/assets/images/quorum/{knight_rider.gif → loading.gif} +0 -0
  45. /data/app/views/quorum/jobs/{_blastn_form.html.erb → form/_blastn_form.html.erb} +0 -0
  46. /data/app/views/quorum/jobs/{_blastp_form.html.erb → form/_blastp_form.html.erb} +0 -0
  47. /data/app/views/quorum/jobs/{_blastx_form.html.erb → form/_blastx_form.html.erb} +0 -0
  48. /data/app/views/quorum/jobs/{_tblastn_form.html.erb → form/_tblastn_form.html.erb} +0 -0
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift(File.expand_path("../../lib", __FILE__))
4
+
5
+ require 'trollop'
6
+ require 'fetch_tools/blast_db'
7
+
8
+ FETCH_TOOLS = {
9
+ "blastdbcmd" => ["blastdbcmd"]
10
+ }
11
+
12
+ module Quorum
13
+ #
14
+ # Parse Options for Quorum Fetch
15
+ #
16
+ class Fetch
17
+
18
+ def initialize
19
+ opts = Trollop::options do
20
+ text <<-HEAD
21
+
22
+ Quorum
23
+
24
+ A flexible bioinformatics search tool.
25
+
26
+ Options:
27
+
28
+ HEAD
29
+
30
+ # Fetch tool
31
+ opt :fetch_tool, "Fetch tool to execute. Available tools: " <<
32
+ "#{FETCH_TOOLS.keys.join(', ')}", :type => :string,
33
+ :required => true, :short => "-f"
34
+
35
+ # General settings
36
+ opt :log_directory, "Path to log directory", :type => :string,
37
+ :required => true, :short => "-l"
38
+ opt :tmp_directory, "Path to tmp directory", :type => :string,
39
+ :required => true, :short => "-m"
40
+
41
+ # Global settings
42
+ opt :fetch_database, "Path to fetch tool database", :type => :string,
43
+ :short => "-d"
44
+ opt :fetch_database_names, "Semicolon delimited database names",
45
+ :type => :string, :short => "-n"
46
+
47
+ # Algorithm specific opts
48
+ opt :blast_hit_id, "Blast hit id", :type => :string, :short => "-b"
49
+ opt :blast_hit_display_id, "Blast hit display id", :type => :string,
50
+ :short => "-s"
51
+ opt :blast_algo, "Blast algorithm", :type => :string, :short => "-a"
52
+ end
53
+
54
+ @args = {} # Contains valid opts.
55
+
56
+ ## Additional opt validation. ##
57
+
58
+ unless FETCH_TOOLS.keys.include?(opts[:fetch_tool].downcase)
59
+ Trollop::die :fetch_tool, "fetch_tool not found\n" <<
60
+ "Available tools: " + FETCH_TOOLS.keys.join(", ")
61
+ end
62
+
63
+ @args[:fetch_tool] = opts[:fetch_tool].downcase
64
+
65
+ unless opts[:fetch_database] && Dir.exists?(opts[:fetch_database])
66
+ Trollop::die :fetch_database, "fetch tool database not found\n" <<
67
+ "Supplied directory: " + opts[:fetch_database]
68
+ end
69
+
70
+ @args[:fetch_database] = opts[:fetch_database]
71
+ @args[:fetch_database_names] = opts[:fetch_database_names]
72
+
73
+ unless Dir.exists?(opts[:log_directory])
74
+ Trollop::die :log_directory, "log directory not found\n" <<
75
+ "Supplied directory: " + opts[:log_directory]
76
+ end
77
+
78
+ @args[:log_directory] = opts[:log_directory]
79
+ @args[:tmp_directory] = opts[:tmp_directory]
80
+ @args[:blast_hit_id] = opts[:blast_hit_id]
81
+ @args[:blast_hit_display_id] = opts[:blast_hit_display_id]
82
+ @args[:blast_algo] = opts[:blast_algo]
83
+
84
+ ## Check System Dependancies ##
85
+
86
+ check_dependencies
87
+
88
+ ## Execute fetch tool ##
89
+
90
+ if @args[:fetch_tool].include? "blastdbcmd"
91
+ blast = Quorum::FetchTools::BlastDb.new(@args)
92
+ blast.execute_blast_db_cmd
93
+ end
94
+ end
95
+
96
+ #
97
+ # Check system dependencies.
98
+ #
99
+ def check_dependencies
100
+ FETCH_TOOLS[@args[:fetch_tool]].each do |f|
101
+ system("which #{f} > /dev/null 2>&1")
102
+ if $?.exitstatus > 0
103
+ Trollop::die "Quorum dependency not found for tool " <<
104
+ "#{@args[:fetch_tool].to_s}. Please add `#{f}` to your PATH."
105
+ end
106
+ end
107
+ end
108
+
109
+ end
110
+ end
111
+
112
+ if __FILE__ == $0
113
+ Quorum::Fetch.new
114
+ end
115
+
Binary file
Binary file
@@ -0,0 +1,106 @@
1
+ $LOAD_PATH.unshift(File.expand_path("../../", __FILE__))
2
+
3
+ require 'logger'
4
+
5
+ module Quorum
6
+ module FetchTools
7
+ #
8
+ # Blast DB Fetch Tool
9
+ #
10
+ class BlastDb
11
+
12
+ # blastdbcmd -dbtype
13
+ DB_TYPE = {
14
+ "blastn" => "nucl",
15
+ "blastx" => "prot",
16
+ "tblastn" => "nucl",
17
+ "blastp" => "prot"
18
+ }
19
+
20
+ private
21
+
22
+ def initialize(args)
23
+ @tool = args[:fetch_tool]
24
+ @entry = args[:blast_hit_id]
25
+ @hit_display_id = args[:blast_hit_display_id]
26
+ @blast_algo = args[:blast_algo]
27
+ @log_directory = args[:log_directory]
28
+ @tmp_directory = args[:tmp_directory]
29
+ @fetch_database = args[:fetch_database]
30
+ @databases = args[:fetch_database_names]
31
+
32
+ @logger = Quorum::Logger.new(@log_directory)
33
+
34
+ @db = @databases.split(';')
35
+ @db.map! { |d| File.join(@fetch_database, d) }
36
+
37
+ @db_type = DB_TYPE[@blast_algo]
38
+ @db_type ||= 'guess'
39
+ end
40
+
41
+ #
42
+ # Generate the blastdbcmd(s).
43
+ #
44
+ def generate_blast_db_cmds
45
+ @cmds = []
46
+ @db.each do |d|
47
+ blastdbcmd = "blastdbcmd " <<
48
+ "-db '#{d}' " <<
49
+ "-dbtype '#{@db_type}' " <<
50
+ "-entry '#{@entry}' "
51
+ @cmds << blastdbcmd
52
+ end
53
+ end
54
+
55
+ #
56
+ # Parse the blastdbcmd returned sequence(s) and delete if @hit_display_id
57
+ # is not present.
58
+ #
59
+ def parse_and_send_results
60
+ seqs = @seqs.split('>')
61
+ seqs.delete_if { |s| s.empty? || !s.include?(@hit_display_id) }
62
+ if seqs.length != 1
63
+ @logger.log(
64
+ "Quorum::FetchTools::BlastDb#parse_and_send_results",
65
+ "blastdbcmd returned #{seqs.length} sequence(s). Please ensure " <<
66
+ "your Blast database source FASTA headers are unique across ALL " <<
67
+ "databases. See the entry above for details."
68
+ )
69
+ "An error occurred while processing your request."
70
+ else
71
+ ">" << seqs.first
72
+ end
73
+ end
74
+
75
+ public
76
+
77
+ #
78
+ # Execute the blastdbcmd(s) and return the matching sequence.
79
+ #
80
+ # To make Blast execute as quickly as possible, each selected
81
+ # algorithm blasts against all supplied databases at once.
82
+ #
83
+ # See quorum/lib/search_tools/blast.rb for more information.
84
+ #
85
+ # One consequence of this is not knowing which Blast database to use
86
+ # when retrieving a hit sequence via blastdbcmd.
87
+ #
88
+ # See blastdbcmd -help for more information.
89
+ #
90
+ # To work around this issue, simply execute blastdbcmd against all
91
+ # Blast databases and filter on hit_display_id.
92
+ #
93
+ def execute_blast_db_cmd
94
+ generate_blast_db_cmds
95
+ @logger.log("NCBI Blast", @cmds.join('; '))
96
+
97
+ @seqs = ""
98
+ @cmds.each { |c| @seqs << `#{c} 2> /dev/null` }
99
+
100
+ seq = parse_and_send_results
101
+ $stdout.print seq
102
+ end
103
+
104
+ end
105
+ end
106
+ end
@@ -11,6 +11,8 @@ module Quorum
11
11
  class Blast
12
12
 
13
13
  class QuorumJob < ActiveRecord::Base
14
+ set_table_name "quorum_jobs"
15
+
14
16
  has_one :quorum_blastn_job,
15
17
  :foreign_key => "job_id"
16
18
  has_many :quorum_blastn_job_reports,
@@ -33,38 +35,46 @@ module Quorum
33
35
  end
34
36
 
35
37
  class QuorumBlastnJob < ActiveRecord::Base
38
+ set_table_name "quorum_blastn_jobs"
36
39
  belongs_to :quorum_job
37
40
  has_many :quorum_blastn_job_reports
38
41
  end
39
42
 
40
43
  class QuorumBlastnJobReport < ActiveRecord::Base
44
+ set_table_name "quorum_blastn_job_reports"
41
45
  belongs_to :quorum_blastn_job
42
46
  end
43
47
 
44
48
  class QuorumBlastxJob < ActiveRecord::Base
49
+ set_table_name "quorum_blastx_jobs"
45
50
  belongs_to :quorum_job
46
51
  has_many :quorum_blastx_job_reports
47
52
  end
48
53
 
49
54
  class QuorumBlastxJobReport < ActiveRecord::Base
55
+ set_table_name "quorum_blastx_job_reports"
50
56
  belongs_to :quorum_blastx_job
51
57
  end
52
58
 
53
59
  class QuorumTblastnJob < ActiveRecord::Base
60
+ set_table_name "quorum_tblastn_jobs"
54
61
  belongs_to :quorum_job
55
62
  has_many :quorum_tblastn_job_reports
56
63
  end
57
64
 
58
65
  class QuorumTblastnJobReport < ActiveRecord::Base
66
+ set_table_name "quorum_tblastn_job_reports"
59
67
  belongs_to :quorum_tblastn_job
60
68
  end
61
69
 
62
70
  class QuorumBlastpJob < ActiveRecord::Base
71
+ set_table_name "quorum_blastp_jobs"
63
72
  belongs_to :quorum_job
64
73
  has_many :quorum_blastp_job_reports
65
74
  end
66
75
 
67
76
  class QuorumBlastpJobReport < ActiveRecord::Base
77
+ set_table_name "quorum_blastp_job_reports"
68
78
  belongs_to :quorum_blastp_job
69
79
  end
70
80
 
@@ -235,26 +245,26 @@ module Quorum
235
245
  end
236
246
 
237
247
  #
238
- # Format Blast report hit_id and hit_def.
248
+ # Format Blast report hit_display_id and hit_def.
239
249
  #
240
250
  # For added flexibility, Quorum doesn't parse seqids or deflines.
241
251
  # Instead, format_hit splits the hit_def on whitespace and
242
- # reports hit_id as the first element and hit_def as the second.
252
+ # reports hit_display_id as the first element and hit_def as the second.
243
253
  #
244
254
  def format_hit(str)
245
- hit_id = ""
255
+ hit_display_id = ""
246
256
  hit_def = ""
247
257
 
248
258
  hit = str.split(" ", 2)
249
259
  if hit.length < 2
250
- hit_id = hit.first
260
+ hit_display_id = hit.first
251
261
  hit_def = "None"
252
262
  else
253
- hit_id = hit.first
263
+ hit_display_id = hit.first
254
264
  hit_def = hit.last
255
265
  end
256
266
 
257
- return hit_id, hit_def
267
+ return hit_display_id, hit_def
258
268
  end
259
269
 
260
270
  #
@@ -275,8 +285,9 @@ module Quorum
275
285
  @data[:query_len] = iteration.query_len
276
286
 
277
287
  iteration.each do |hit|
278
- @data[:hit_id], @data[:hit_def] = format_hit(hit.hit_def)
288
+ @data[:hit_display_id], @data[:hit_def] = format_hit(hit.hit_def)
279
289
 
290
+ @data[:hit_id] = hit.hit_id
280
291
  @data[:hit_accession] = hit.accession
281
292
  @data[:hit_len] = hit.len
282
293
 
@@ -4,6 +4,7 @@ describe Quorum::Job do
4
4
 
5
5
  before(:each) do
6
6
  @job = Quorum::Job.new()
7
+ ResqueSpec.reset!
7
8
  end
8
9
 
9
10
  it "fails validation without params (using error_on)" do
@@ -22,9 +23,6 @@ describe Quorum::Job do
22
23
  end
23
24
 
24
25
  it "queues workers after save" do
25
- resque = double("Resque")
26
- resque.stub(:enqueue)
27
-
28
26
  @job.sequence = File.open(
29
27
  File.expand_path("../../data/nucl_prot_seqs.txt", __FILE__)
30
28
  ).read
@@ -33,8 +31,9 @@ describe Quorum::Job do
33
31
  @job.blastn_job.queue = true
34
32
  @job.blastn_job.blast_dbs = ["tmp"]
35
33
 
36
- @job.should_receive(:queue_workers)
37
34
  @job.save!
35
+
36
+ Workers::System.should have_queue_size_of(1)
38
37
  end
39
38
 
40
39
  end
@@ -61,4 +61,9 @@ describe "Quorum" do
61
61
  f = File.open(File.join(@dummy_path, "config", "routes.rb"), "r")
62
62
  f.read.include?("mount Quorum::Engine => \"/quorum\"").should be_true
63
63
  end
64
+
65
+ it "ensures Resque::Server is mounted in dummy/config/routes.rb" do
66
+ f = File.open(File.join(@dummy_path, "config", "routes.rb"), "r")
67
+ f.read.include?("mount Resque::Server.new, :at => \"/quorum/resque\"").should be_true
68
+ end
64
69
  end
@@ -51,8 +51,12 @@ describe "Jobs" do
51
51
  before(:all) do
52
52
  Capybara.current_driver = :selenium
53
53
  end
54
+ before(:each) do
55
+ ResqueSpec.reset!
56
+ ResqueSpec.inline = true
57
+ end
54
58
  describe "submit sequences in attached file" do
55
- it "check Blast algorithms, fill in default values and view query results" do
59
+ it "check algorithms, fill in values, view results and download hit sequence" do
56
60
  visit new_job_path
57
61
  current_path.should eq(new_job_path)
58
62
 
@@ -109,13 +113,22 @@ describe "Jobs" do
109
113
  click_link "Tblastn"
110
114
  page.should have_content("Your search returned 0 hits.")
111
115
 
116
+ ## Interact with the Blast results. ##
112
117
  click_link "Blastn"
118
+
119
+ # Render modal box.
113
120
  find("#blastn-results").find("td a").click
114
121
  page.should have_content("Quorum Report Details")
115
122
  page.should have_content("qseq")
116
123
  page.should have_content("hseq")
124
+ # Download sequence
125
+ find("p.small a#download_sequence_1").click
126
+ page.should have_content("Fetching sequence...")
127
+ page.should have_content("Sequence Downloaded Successfully")
117
128
 
118
129
  click_link "Blastp"
130
+
131
+ # Render modal box.
119
132
  find("#blastp-results").find("td a").click
120
133
  page.should have_content("Quorum Report Details")
121
134
  page.should have_content("qseq")
data/spec/spec_helper.rb CHANGED
@@ -5,6 +5,7 @@ require 'rspec/rails'
5
5
  require 'capybara/rspec'
6
6
  require 'factory_girl'
7
7
  require 'database_cleaner'
8
+ require 'resque_spec'
8
9
 
9
10
  FactoryGirl.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
10
11
  FactoryGirl.find_definitions
@@ -13,7 +14,7 @@ ENGINE_RAILS_ROOT = File.expand_path("../../", __FILE__)
13
14
 
14
15
  # Requires supporting ruby files with custom matchers and macros, etc,
15
16
  # in spec/support/ and its subdirectories.
16
- Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
17
+ Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
17
18
 
18
19
  RSpec.configure do |config|
19
20
  config.mock_with :rspec
@@ -42,4 +43,34 @@ RSpec.configure do |config|
42
43
  config.after(:each) do
43
44
  DatabaseCleaner.clean
44
45
  end
46
+
47
+ ## Redis ##
48
+ REDIS_PID = File.expand_path("../dummy/tmp/pids/redis-test.pid", __FILE__)
49
+ REDIS_CACHE_PATH = File.expand_path("../dummy/tmp/cache/", __FILE__)
50
+
51
+ config.before(:suite) do
52
+ redis_options = {
53
+ "daemonize" => "yes",
54
+ "pidfile" => REDIS_PID,
55
+ "port" => 9736,
56
+ "timeout" => 300,
57
+ "save 900" => 1,
58
+ "save 300" => 1,
59
+ "save 60" => 10000,
60
+ "dbfilename" => "dump.rdb",
61
+ "dir" => REDIS_CACHE_PATH,
62
+ "loglevel" => "debug",
63
+ "logfile" => "stdout",
64
+ "databases" => 16
65
+ }.map { |k, v| "#{k} #{v}" }.join('
66
+ ')
67
+ `echo '#{redis_options}' | redis-server -`
68
+ end
69
+
70
+ config.after(:suite) do
71
+ %x{
72
+ cat #{REDIS_PID} | xargs kill -QUIT
73
+ rm -f #{REDIS_CACHE_PATH}dump.rdb
74
+ }
75
+ end
45
76
  end
@@ -0,0 +1,16 @@
1
+ require 'stringio'
2
+
3
+ #
4
+ # Capture STDOUT and STDERR
5
+ #
6
+ def capture(*streams)
7
+ streams.map! { |stream| stream.to_s }
8
+ begin
9
+ result = StringIO.new
10
+ streams.each { |stream| eval "$#{stream} = result" }
11
+ yield
12
+ ensure
13
+ streams.each { |stream| eval("$#{stream} = #{stream.upcase}") }
14
+ end
15
+ result.string
16
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+ require File.expand_path("../../dummy/quorum/lib/fetch_tools/blast_db", __FILE__)
3
+
4
+ describe "Quorum::FetchTools::BlastDb" do
5
+ describe "#execute_blast_db_cmd" do
6
+ before(:each) do
7
+ # Set the args as though we executed bin/fetch
8
+ @args = {
9
+ :fetch_tool => "blastdbcmd",
10
+ :blast_hit_id => nil,
11
+ :blast_hit_display_id => nil,
12
+ :blast_algo => nil,
13
+ :fetch_database_names => "test",
14
+
15
+ :log_directory => File.expand_path(
16
+ "../../dummy/quorum/log", __FILE__
17
+ ),
18
+ :tmp_directory => File.expand_path(
19
+ "../../dummy/quorum/tmp", __FILE__
20
+ ),
21
+ :fetch_database => File.expand_path(
22
+ "../../dummy/quorum/blastdb", __FILE__
23
+ )
24
+ }
25
+ end
26
+
27
+ it "executes blastdbcmd for blastn and returns correct sequence" do
28
+ @args[:blast_hit_id] = "gnl|BL_ORD_ID|0"
29
+ @args[:blast_hit_display_id] = "TOG900080"
30
+ @args[:blast_algo] = "blastn"
31
+
32
+ seqs = File.readlines(
33
+ File.expand_path("../../data/nucl_seqs.txt", __FILE__)
34
+ )
35
+ seqs[0].gsub!(">", "")
36
+ seqs.insert(0, ">" + @args[:blast_hit_id] + " ")
37
+
38
+ # Sequence #execute_blast_db_cmd should return.
39
+ seq = seqs.slice(0,3).join("").gsub("\n", "")
40
+
41
+ fetch = Quorum::FetchTools::BlastDb.new(@args)
42
+ lambda {
43
+ output = capture(:stdout) {
44
+ fetch.execute_blast_db_cmd
45
+ }
46
+ output.gsub("\n", "").should eq(seq)
47
+ }.should_not raise_error
48
+ end
49
+
50
+ it "returns error message if filtered sequence.length != 1" do
51
+ @args[:blast_hit_id] = "null"
52
+ @args[:blast_hit_display_id] = "null"
53
+ @args[:blast_algo] = "blastp"
54
+ fetch = Quorum::FetchTools::BlastDb.new(@args)
55
+ lambda {
56
+ output = capture(:stdout) {
57
+ fetch.execute_blast_db_cmd
58
+ }
59
+ output.should eq("An error occurred while processing your request.")
60
+ }.should_not raise_error
61
+ end
62
+ end
63
+ end
@@ -1,8 +1,114 @@
1
1
  require 'spec_helper'
2
- require 'generators/templates/blast'
2
+ require File.expand_path("../../dummy/quorum/lib/search_tools/blast", __FILE__)
3
3
 
4
- # Let the request specs handle Quorum::SearchTools
5
4
  describe "Quorum::SearchTools::Blast" do
6
5
  describe "#execute_blast" do
6
+ before(:each) do
7
+ # Set args as though we executed bin/search.
8
+ @args = {
9
+ :search_tool => "blastn",
10
+ :id => nil,
11
+ :log_directory => File.expand_path(
12
+ "../../dummy/quorum/log", __FILE__
13
+ ),
14
+ :tmp_directory => File.expand_path(
15
+ "../../dummy/quorum/tmp", __FILE__
16
+ ),
17
+ :search_database => File.expand_path(
18
+ "../../dummy/quorum/blastdb", __FILE__
19
+ ),
20
+ :threads => 1
21
+ }
22
+
23
+ @job = Quorum::Job.new()
24
+
25
+ @job.sequence = File.open(
26
+ File.expand_path("../../data/nucl_prot_seqs.txt", __FILE__)
27
+ ).read
28
+
29
+ @job.build_blastn_job
30
+ @job.blastn_job.queue = true
31
+ @job.blastn_job.blast_dbs = ["test"]
32
+
33
+ @job.build_blastx_job
34
+ @job.blastx_job.queue = true
35
+ @job.blastx_job.blast_dbs = ["test"]
36
+
37
+ @job.build_tblastn_job
38
+ @job.tblastn_job.queue = true
39
+ @job.tblastn_job.blast_dbs = ["test"]
40
+
41
+ @job.build_blastp_job
42
+ @job.blastp_job.queue = true
43
+ @job.blastp_job.blast_dbs = ["test"]
44
+ end
45
+
46
+ it "executes blastn on a given dataset" do
47
+ @job.stub(:queue_workers)
48
+ @job.save!
49
+
50
+ @args[:id] = @job.id
51
+
52
+ blast = Quorum::SearchTools::Blast.new(@args)
53
+ expect {
54
+ blast.execute_blast
55
+ }.to_not raise_error
56
+
57
+ Dir.glob(
58
+ File.join(@args[:tmp_directory], "*")
59
+ ).length.should be == 0
60
+ end
61
+
62
+ it "executes blastx on a given dataset" do
63
+ @job.stub(:queue_workers)
64
+ @job.save!
65
+
66
+ @args[:search_tool] = "blastx"
67
+ @args[:id] = @job.id
68
+
69
+ blast = Quorum::SearchTools::Blast.new(@args)
70
+ expect {
71
+ blast.execute_blast
72
+ }.to raise_error(SystemExit)
73
+
74
+ Dir.glob(
75
+ File.join(@args[:tmp_directory], "*")
76
+ ).length.should be == 0
77
+ end
78
+
79
+ it "executes tblastn on a given dataset" do
80
+ @job.stub(:queue_workers)
81
+ @job.save!
82
+
83
+ @args[:search_tool] = "tblastn"
84
+ @args[:id] = @job.id
85
+
86
+ blast = Quorum::SearchTools::Blast.new(@args)
87
+ expect {
88
+ blast.execute_blast
89
+ }.to raise_error(SystemExit)
90
+
91
+ Dir.glob(
92
+ File.join(@args[:tmp_directory], "*")
93
+ ).length.should be == 0
94
+ end
95
+
96
+ it "executes blastp on a given dataset" do
97
+ @job.stub(:queue_workers)
98
+ @job.save!
99
+
100
+ @args[:search_tool] = "blastp"
101
+ @args[:id] = @job.id
102
+
103
+ blast = Quorum::SearchTools::Blast.new(@args)
104
+ expect {
105
+ blast.execute_blast
106
+ }.to_not raise_error
107
+
108
+ Dir.glob(
109
+ File.join(@args[:tmp_directory], "*")
110
+ ).length.should be == 0
111
+ end
112
+
7
113
  end
8
114
  end