dtf 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. data/.gitignore +44 -0
  2. data/.rspec +1 -0
  3. data/.rvmrc +52 -0
  4. data/.travis.yml +16 -0
  5. data/Gemfile +26 -0
  6. data/History.md +75 -0
  7. data/LICENSE +19 -10
  8. data/README.md +67 -45
  9. data/Rakefile +9 -0
  10. data/TODO +25 -0
  11. data/app/models/analysis_case.rb +12 -0
  12. data/app/models/case_test.rb +10 -0
  13. data/app/models/user.rb +12 -0
  14. data/app/models/verification_suite.rb +22 -0
  15. data/bin/dtf +24 -3
  16. data/bin/dtf-create_user +11 -0
  17. data/bin/dtf-create_vs +10 -0
  18. data/bin/dtf-delete_user +18 -0
  19. data/bin/dtf-delete_vs +14 -0
  20. data/bin/dtf-setup +7 -0
  21. data/db/migrate/20120503050925_create_users.rb +15 -0
  22. data/db/migrate/20120508000959_create_verification_suites.rb +14 -0
  23. data/db/migrate/20120616203047_create_analysis_cases.rb +15 -0
  24. data/db/migrate/20120616203436_create_case_tests.rb +15 -0
  25. data/db/schema.rb +48 -0
  26. data/doc/.gitkeep +0 -0
  27. data/dtf.gemspec +36 -0
  28. data/examples/db/config.yml +25 -0
  29. data/lib/config/environment.rb +49 -0
  30. data/lib/dtf.rb +4 -91
  31. data/lib/dtf/version.rb +5 -0
  32. data/lib/tasks/setup.thor +52 -0
  33. data/spec/acceptance/0001_create_basic_models.feature +9 -0
  34. data/spec/acceptance/0002_create_basic_associations.feature +11 -0
  35. data/spec/acceptance/0003_execute_help_switch.feature +7 -0
  36. data/spec/fabricators/analysis_case_fabricator.rb +7 -0
  37. data/spec/fabricators/case_test_fabricator.rb +6 -0
  38. data/spec/fabricators/user_fabricator.rb +8 -0
  39. data/spec/fabricators/verification_suite_fabricator.rb +6 -0
  40. data/spec/models/analysis_case_spec.rb +21 -0
  41. data/spec/models/case_test_spec.rb +20 -0
  42. data/spec/models/user_spec.rb +21 -0
  43. data/spec/models/verification_suite_spec.rb +21 -0
  44. data/spec/spec_helper.rb +18 -0
  45. data/spec/steps/feature_steps.rb +18 -0
  46. data/spec/support/custom_matchers/model_steps.rb +46 -0
  47. data/spec/support/helpers/.gitkeep +0 -0
  48. metadata +303 -70
  49. data/lib/dtf/active_patches.rb +0 -21
  50. data/lib/dtf/plugins.rb +0 -102
  51. data/lib/plugins/dtf/comment_test_input.rb +0 -40
  52. data/lib/plugins/dtf/env_match_test.rb +0 -18
  53. data/lib/plugins/dtf/error_summary_output.rb +0 -93
  54. data/lib/plugins/dtf/output_match_test.rb +0 -17
  55. data/lib/plugins/dtf/stats_output.rb +0 -73
  56. data/lib/plugins/dtf/status_test.rb +0 -17
  57. data/lib/plugins/dtf/text_output.rb +0 -52
@@ -0,0 +1,12 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ class User < ActiveRecord::Base
4
+
5
+ attr_accessible :full_name, :email_address, :user_name
6
+ validates_presence_of :full_name, :email_address, :user_name
7
+
8
+ has_many :verification_suites, :dependent => :destroy
9
+ has_many :analysis_cases, :through => :verification_suites, :dependent => :destroy
10
+ has_many :case_tests, :through => :verification_suites, :dependent => :destroy
11
+
12
+ end
@@ -0,0 +1,22 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ class VerificationSuite < ActiveRecord::Base
4
+
5
+ attr_accessible :name, :description
6
+ validates_presence_of :name, :description
7
+
8
+ belongs_to :user, :autosave => :true
9
+ has_many :analysis_cases, :dependent => :destroy
10
+ has_many :case_tests, :through => :analysis_cases, :dependent => :destroy
11
+
12
+ # ASSOCIATIONS BREAKDOWN
13
+ # ----------------------
14
+ # Each VerificationSuite is comprised of many AnalysisCases, Each AnalysisCase
15
+ # contain multiple case_tests, owned by both the User and the AnalysisCase.
16
+ # The goal is to make 'packs' of tests which Users can share between Suites,
17
+ # grouped by Cases, and even share those Tests between Cases. Also, Users
18
+ # should be able to share their individual Test(s), AnalysisCase(s), and
19
+ # VerificationSuite(s) with other Users for inclusion in their own
20
+ # AnalysisCase(s) and Suite(s) allowing for mix-and-match batching.
21
+
22
+ end
data/bin/dtf CHANGED
@@ -1,7 +1,28 @@
1
1
  #!/usr/bin/env ruby
2
+ #
3
+ # This is the master script to be used to manage the various Verification Suites,
4
+ # Analysis Cases, and Case Tests
5
+ #
6
+ # Ex: dtf create_user -u|--user @user_name -n|--name "John Public" -e|--email
7
+ # "j@public.com"
8
+ #
9
+ # -u -n and -e are _required_ parameters
10
+ #
11
+ # Accessing the help system
12
+ # Ex: dtf help create_user
2
13
 
3
- program_root = File.dirname( File.dirname( __FILE__ ) )
14
+ require 'dtf'
15
+ require 'optparse'
4
16
 
5
- require "#{program_root}/lib/dtf"
17
+ options = {}
6
18
 
7
- exit DTF.new.run_tests ARGV
19
+ OptionParser.new do |opts|
20
+ opts.banner = "Usage: dtf <cmd> [options]"
21
+
22
+ opts.on("-h", "--help",
23
+ "Show this message") do |h|
24
+ options[:help] = h
25
+ puts opts
26
+ end
27
+
28
+ end.parse!
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This script is used to create User entries in the db for owning the various
4
+ # Verification Suites, Analysis Cases, and Case Tests
5
+ #
6
+ # Ex: dtf-create_user -u|--user @user_name -n|--name "John Public" -e|--email
7
+ # "j@public.com"
8
+ #
9
+ # -u -n and -e are _required_ parameters
10
+ #
11
+
data/bin/dtf-create_vs ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file is used to create a Verification Suite from the commandline.
4
+ # A owning User, which must already exist, must be passed for ownership.
5
+ # At minimum, the name of the suite must also be passed.
6
+ #
7
+ # Ex: dtf-create_vs -u|--user @user_name -n|--name "DTF Testing Suite"
8
+ # -u and -n are _required_ parameters
9
+ #
10
+
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This script is used to delete existing User entries in the db
4
+ # This script will also need to reassign any existing entries such as for their
5
+ # Verification Suites, Analysis Cases, and Case Tests to the Public user
6
+ # The Public user is a generic user that needs to be created initially so that
7
+ # when a user is deleted, their suites are assigned to Public if they wish to
8
+ # be kept. The deletion should ask if the suites should be permanently deleted
9
+ # or reassigned to Public.
10
+ #
11
+ # Ex: dtf-delete_user -u|--user @user_name [--all] [--reassign]
12
+ # --all means to delete all the user test suites permenantly
13
+ # --reassign means reassign test suites to the Public user for reuse by others
14
+ # first, and then delete the specified user.
15
+ #
16
+ # -u and EITHER --all OR --reassign are _required_ parameters
17
+ #
18
+
data/bin/dtf-delete_vs ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This script is used to delete existing Verification Suite entries in the db
4
+ # The Public user is a generic user that needs to be created initially so that
5
+ # when a user is deleted, their suites are assigned to Public if they wish to
6
+ # be kept. The deletion should ask if the suites should be permanently deleted
7
+ # or reassigned to Public. This applies to all Analysis Cases, and Case Tests
8
+ # as well
9
+ #
10
+ # Ex dtf-delete_vs -u|--user @user_name -n|--name "DTF Testing Suite"
11
+ #
12
+ # -u and -n are _required_ parameters
13
+ #
14
+
data/bin/dtf-setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'dtf'
4
+ require 'thor'
5
+
6
+ %x[thor dtf_setup:install]
7
+
@@ -0,0 +1,15 @@
1
+ class CreateUsers < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :users do |t|
4
+ t.string :full_name
5
+ t.string :user_name
6
+ t.string :email_address
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+
12
+ def self.down
13
+ drop_table :users
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ class CreateVerificationSuites < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :verification_suites do |t|
4
+ t.string :name
5
+ t.text :description
6
+ t.references :user
7
+ t.timestamps
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :verification_suites
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ class CreateAnalysisCases < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :analysis_cases do |t|
4
+ t.string :name
5
+ t.string :description
6
+ t.references :verification_suite
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+
12
+ def self.down
13
+ drop_table :analysis_cases
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ class CreateCaseTests < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :case_tests do |t|
4
+ t.string :description
5
+ t.text :cmd
6
+ t.references :analysis_case
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+
12
+ def self.down
13
+ drop_table :case_tests
14
+ end
15
+ end
data/db/schema.rb ADDED
@@ -0,0 +1,48 @@
1
+ # encoding: UTF-8
2
+ # This file is auto-generated from the current state of the database. Instead
3
+ # of editing this file, please use the migrations feature of Active Record to
4
+ # incrementally modify your database, and then regenerate this schema definition.
5
+ #
6
+ # Note that this schema.rb definition is the authoritative source for your
7
+ # database schema. If you need to create the application database on another
8
+ # system, you should be using db:schema:load, not running all the migrations
9
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
11
+ #
12
+ # It's strongly recommended to check this file into your version control system.
13
+
14
+ ActiveRecord::Schema.define(:version => 20120616203436) do
15
+
16
+ create_table "analysis_cases", :force => true do |t|
17
+ t.string "name"
18
+ t.string "description"
19
+ t.integer "verification_suite_id"
20
+ t.datetime "created_at", :null => false
21
+ t.datetime "updated_at", :null => false
22
+ end
23
+
24
+ create_table "case_tests", :force => true do |t|
25
+ t.string "description"
26
+ t.text "cmd"
27
+ t.integer "analysis_case_id"
28
+ t.datetime "created_at", :null => false
29
+ t.datetime "updated_at", :null => false
30
+ end
31
+
32
+ create_table "users", :force => true do |t|
33
+ t.string "full_name"
34
+ t.string "user_name"
35
+ t.string "email_address"
36
+ t.datetime "created_at", :null => false
37
+ t.datetime "updated_at", :null => false
38
+ end
39
+
40
+ create_table "verification_suites", :force => true do |t|
41
+ t.string "name"
42
+ t.text "description"
43
+ t.integer "user_id"
44
+ t.datetime "created_at", :null => false
45
+ t.datetime "updated_at", :null => false
46
+ end
47
+
48
+ end
data/doc/.gitkeep ADDED
File without changes
data/dtf.gemspec ADDED
@@ -0,0 +1,36 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/dtf/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Deryl R. Doucette"]
6
+ gem.email = ["me@deryldoucette.com"]
7
+ gem.description = %q{DTF is a modular testing framework skeleton. This is the control gem which contains the Suite's db schema(s) and control/management scripts.}
8
+ gem.summary = %q{DTF is a modular testing framework. This is the control gem.}
9
+ gem.homepage = "https://github.com/dtf-gems/dtf"
10
+ gem.license = 'MIT'
11
+ gem.platform = Gem::Platform::RUBY
12
+ gem.files = `git ls-files`.split($\)
13
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
14
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
15
+ gem.name = "dtf"
16
+ gem.require_paths = ["lib"]
17
+ gem.version = Dtf::VERSION
18
+ gem.rubyforge_project = "dtf"
19
+ gem.required_ruby_version = ">= 1.9.3"
20
+
21
+ gem.add_dependency "thor"
22
+ gem.add_dependency "rake"
23
+ gem.add_dependency "activerecord"
24
+ gem.add_dependency "activemodel"
25
+ gem.add_dependency "activesupport"
26
+ gem.add_dependency "sqlite3"
27
+ gem.add_dependency "json"
28
+ gem.add_dependency "json_pure"
29
+ gem.add_dependency "standalone_migrations"
30
+
31
+ gem.add_development_dependency "turnip"
32
+ gem.add_development_dependency "rspec", [">=2.10.0"]
33
+ gem.add_development_dependency "fabrication"
34
+ gem.add_development_dependency "vcr"
35
+
36
+ end
@@ -0,0 +1,25 @@
1
+ # SQLite version 3.x
2
+ # gem install sqlite3
3
+ #
4
+ # Ensure the SQLite 3 gem is defined in your Gemfile
5
+ # gem 'sqlite3'
6
+ development:
7
+ adapter: sqlite3
8
+ database: db/dtf_development.sqlite3
9
+ pool: 5
10
+ timeout: 5000
11
+
12
+ # Warning: The database defined as "test" will be erased and
13
+ # re-generated from your development database when you run "rake".
14
+ # Do not set this db to the same as development or production.
15
+ test:
16
+ adapter: sqlite3
17
+ database: db/dtf_test.sqlite3
18
+ pool: 5
19
+ timeout: 5000
20
+
21
+ production:
22
+ adapter: sqlite3
23
+ database: db/dtf_production.sqlite3
24
+ pool: 5
25
+ timeout: 5000
@@ -0,0 +1,49 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ # Application wide requirements
4
+ require 'active_record'
5
+ require 'active_model'
6
+ require 'active_support'
7
+ require 'multi_json'
8
+ require 'sqlite3'
9
+ require 'yaml'
10
+ require 'logger'
11
+ require 'thor'
12
+
13
+ # NOTE: Set RAILS_ENV to 'production' for ActiveRecord. Affects the database to use.
14
+ # Change this to 'development' while working on the gem itself, or set it in the
15
+ # environment prefixed to commands, in order to gain access to testing gems.
16
+ ENV['RAILS_ENV'] ||= 'development'
17
+
18
+ # This section is for development and testing. Load your testing framework(s) require's here
19
+ case ENV['RAILS_ENV']
20
+ when 'development', 'test'
21
+ require 'rspec'
22
+ require 'turnip'
23
+ require 'pry'
24
+ require 'pry-debugger'
25
+ require 'pry-doc'
26
+ require 'pry-stack_explorer'
27
+ require 'pry-exception_explorer'
28
+ require 'pry-git'
29
+ require 'pry-editline'
30
+ require 'pry-highlight'
31
+ require 'pry-buffers'
32
+ require 'pry-developer_tools'
33
+ require 'pry-syntax-hacks'
34
+ require 'fabrication'
35
+ else
36
+ true
37
+ end
38
+
39
+ # Load the db config and create a connectoid. Make an ivar so its shared throughout the application
40
+ @dbconfig = YAML::load(File.open(File.join(File.dirname(__FILE__), '../../db/config.yml')))[ENV['RAILS_ENV']]
41
+
42
+ # Establish the database connection
43
+ ActiveRecord::Base.establish_connection(@dbconfig) # Line that actually connects the db.
44
+
45
+ # Load all the models
46
+ Dir["#{File.join(File.dirname(__FILE__), '../../app/models/*.rb')}"].each do |model|
47
+ load "#{model}"
48
+ end
49
+
data/lib/dtf.rb CHANGED
@@ -1,94 +1,7 @@
1
- require 'rubygems'
2
- require 'singleton'
3
- require 'yaml'
4
- require 'session'
1
+ # -*- coding: UTF-8 -*-
5
2
 
6
- lib_root = File.dirname( __FILE__ )
3
+ require "dtf/version"
7
4
 
8
- # include lib in path so plugins get found with Gem.find_files
9
- $:.unshift "#{lib_root}"
10
-
11
- class DTF; end
12
- # load dtf/*.rb
13
- Dir["#{lib_root}/dtf/*.rb"].each{|lib| require lib }
14
-
15
- class DTF
16
- def initialize
17
- @ruby = File.join(RbConfig::CONFIG["bindir"],RbConfig::CONFIG["ruby_install_name"])
18
- @plugins = DTF::Plugins.instance
19
- @failures = 0
20
- end
21
-
22
- def run_tests args
23
- @plugins.load(%w( all_test ))
24
- input_files, not_processed = @plugins.parse_args(args)
25
- if not_processed.size > 0
26
- $stderr.puts "No plugin recognized this option '#{not_processed*" "}'."
27
- exit 1
28
- end
29
- @plugins.load(%w( ErrorSummaryOutput )) if @plugins.output_plugins.empty?
30
- process(input_files)
31
- @failures == 0
32
- end
33
-
34
- def process input_files
35
- @plugins.output_plugins(:start_processing)
36
- input_files.each do |plugin,file|
37
- process_test( plugin.load(file) )
38
- end
39
- @plugins.output_plugins(:end_processing)
40
- end
41
-
42
- def env shell
43
- Hash[ shell.execute(
44
- @ruby + ' -e \'ENV.each{|k,v| printf "#{k}=#{v}\0"}\''
45
- )[0].split("\0").map{|var| var.split('=', 2) } ]
46
- end
47
-
48
- def process_test test
49
- name, commands = test[:name], test[:commands]
50
- shell = Session::Bash.new
51
- _env = env(shell)
52
- @plugins.output_plugins(:start_test, test, _env)
53
- commands.each do |line|
54
- command, tests = line[:cmd], line[:tests]
55
- @plugins.output_plugins(:start_command, line)
56
- _stdout = StringIO.new
57
- _stderr = StringIO.new
58
- _stdboth = StringIO.new
59
- shell.execute "#{command}" do |out, err|
60
- if out
61
- @plugins.output_plugins(:command_out, out)
62
- _stdout << out
63
- _stdboth << out
64
- end
65
- if err
66
- @plugins.output_plugins(:command_err, err)
67
- _stderr << err
68
- _stdboth << err
69
- end
70
- end
71
- _status = shell.status
72
- _env = env(shell)
73
- @plugins.output_plugins(:end_command, line, _status, _env)
74
- process_command_tests _stdout.string, _stderr.string, _stdboth.string, _status, _env, tests
75
- end
76
- @plugins.output_plugins(:end_test, test)
77
- end
78
-
79
- def process_command_tests _stdout, _stderr, _stdboth, _status, env, tests
80
- tests.each do |test|
81
- plugin = @plugins.test_plugins.find{|_plugin| _plugin.matches? test }
82
- if plugin.nil?
83
- status, msg = false, "Could not find plugin for test '#{test}'."
84
- else
85
- status, msg = plugin.execute(test, _stdout, _stderr, _stdboth, _status, env)
86
- end
87
- @failures+=1 unless status
88
- @plugins.output_plugins(:test_processed, test, status, msg)
89
- end
90
- end
91
-
92
- class << self
93
- end
5
+ module Dtf
6
+ load "#{File.join(File.dirname(__FILE__), "/config/environment.rb")}"
94
7
  end