rsutphin-cf_case_check 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/History.txt +3 -0
- data/Manifest.txt +26 -0
- data/README.txt +75 -0
- data/Rakefile +39 -0
- data/bin/cf_case_check +27 -0
- data/lib/case_check/coldfusion_source.rb +92 -0
- data/lib/case_check/commands.rb +103 -0
- data/lib/case_check/configuration.rb +46 -0
- data/lib/case_check/core-ext.rb +51 -0
- data/lib/case_check/reference.rb +63 -0
- data/lib/case_check/references/cfc.rb +47 -0
- data/lib/case_check/references/cfinclude.rb +20 -0
- data/lib/case_check/references/cfmodule.rb +48 -0
- data/lib/case_check/references/custom_tag.rb +50 -0
- data/lib/case_check.rb +60 -0
- data/spec/coldfusion_source_spec.rb +161 -0
- data/spec/commands_spec.rb +103 -0
- data/spec/configuration_spec.rb +42 -0
- data/spec/core_ext_spec.rb +72 -0
- data/spec/reference_spec.rb +52 -0
- data/spec/references/cfc_spec.rb +62 -0
- data/spec/references/cfinclude_spec.rb +66 -0
- data/spec/references/cfmodule_spec.rb +139 -0
- data/spec/references/custom_tag_spec.rb +143 -0
- data/spec/spec_helper.rb +37 -0
- metadata +100 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
module CaseCheck
|
2
|
+
|
3
|
+
# Reference as cf_name (or CF_name)
|
4
|
+
class CustomTag < Reference
|
5
|
+
attr_reader :expected_path, :resolved_to
|
6
|
+
|
7
|
+
class << self
|
8
|
+
attr_writer :directories
|
9
|
+
|
10
|
+
def directories
|
11
|
+
@directories ||= []
|
12
|
+
end
|
13
|
+
|
14
|
+
def search(source)
|
15
|
+
source.scan(/<(CF_(\w+))/i) do |match_data, line_number|
|
16
|
+
self.new(source, match_data[1], line_number)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def recursive_directories
|
21
|
+
directories + directories.collect do |dir|
|
22
|
+
collect_subdirs(dir)
|
23
|
+
end.flatten
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def collect_subdirs(start)
|
29
|
+
[start] + Dir[File.join(start, '*')].select { |f| File.directory?(f) }.collect do |dir|
|
30
|
+
collect_subdirs(dir)
|
31
|
+
end.flatten
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize(source, text, line)
|
36
|
+
super
|
37
|
+
@expected_path = text[3, text.size] + ".cfm"
|
38
|
+
@resolved_to = resolve
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def resolve
|
44
|
+
[File.dirname(source.filename), self.class.recursive_directories].flatten.inject(nil) do |resolved, dir|
|
45
|
+
resolved || resolve_in(dir)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/lib/case_check.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
|
2
|
+
module CaseCheck
|
3
|
+
# :stopdoc:
|
4
|
+
VERSION = '0.0.0'.freeze
|
5
|
+
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
|
6
|
+
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
|
7
|
+
# :startdoc:
|
8
|
+
|
9
|
+
# Returns the version string for the library.
|
10
|
+
#
|
11
|
+
def self.version
|
12
|
+
VERSION
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.status_stream
|
16
|
+
@stderr ||= $stderr
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.status_stream=(err)
|
20
|
+
@stderr = err
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns the library path for the module. If any arguments are given,
|
24
|
+
# they will be joined to the end of the libray path using
|
25
|
+
# <tt>File.join</tt>.
|
26
|
+
#
|
27
|
+
def self.libpath( *args )
|
28
|
+
args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns the lpath for the module. If any arguments are given,
|
32
|
+
# they will be joined to the end of the path using
|
33
|
+
# <tt>File.join</tt>.
|
34
|
+
#
|
35
|
+
def self.path( *args )
|
36
|
+
args.empty? ? PATH : ::File.join(PATH, args.flatten)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Utility method used to rquire all files ending in .rb that lie in the
|
40
|
+
# directory below this file that has the same name as the filename passed
|
41
|
+
# in. Optionally, a specific _directory_ name can be passed in such that
|
42
|
+
# the _filename_ does not have to be equivalent to the directory.
|
43
|
+
#
|
44
|
+
def self.require_all_libs_relative_to( fname, dir = nil )
|
45
|
+
dir ||= ::File.basename(fname, '.*')
|
46
|
+
search_me = ::File.expand_path(
|
47
|
+
::File.join(::File.dirname(fname), dir, '*.rb'))
|
48
|
+
|
49
|
+
Dir.glob(search_me).sort.each {|rb| require rb}
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.exit
|
53
|
+
exit
|
54
|
+
end
|
55
|
+
|
56
|
+
end # module CaseCheck
|
57
|
+
|
58
|
+
CaseCheck.require_all_libs_relative_to(__FILE__)
|
59
|
+
|
60
|
+
# EOF
|
@@ -0,0 +1,161 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[spec_helper])
|
2
|
+
|
3
|
+
module CaseCheck
|
4
|
+
|
5
|
+
describe ColdfusionSource do
|
6
|
+
describe "line_of" do
|
7
|
+
def actual_line_of(content, i)
|
8
|
+
ColdfusionSource.new("dc", content).line_of(i)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "is always line 1 for a single line file" do
|
12
|
+
actual_line_of("some text", 3).should == 1
|
13
|
+
end
|
14
|
+
|
15
|
+
it "can find something on the last line" do
|
16
|
+
actual_line_of("some\ntext\nhere", 13).should == 3
|
17
|
+
end
|
18
|
+
|
19
|
+
it "is 1 for character 0" do
|
20
|
+
actual_line_of("some text", 0).should == 1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "scan" do
|
25
|
+
def perform_scan(content, re)
|
26
|
+
ColdfusionSource.new("dc", content).scan(re) do |md, l|
|
27
|
+
[md[0], l]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it "finds one instance" do
|
32
|
+
actual = perform_scan("123 abc", /[a-z]+/)
|
33
|
+
actual.should have(1).match
|
34
|
+
actual.first.should == ['abc', 1]
|
35
|
+
end
|
36
|
+
|
37
|
+
it "finds multiple instances" do
|
38
|
+
actual = perform_scan("abc def 123 four", /[a-z]+/)
|
39
|
+
actual.should have(3).matches
|
40
|
+
actual[0].should == ['abc', 1]
|
41
|
+
actual[1].should == ['def', 1]
|
42
|
+
actual[2].should == ['four', 1]
|
43
|
+
end
|
44
|
+
|
45
|
+
it "finds instances on multiple lines" do
|
46
|
+
actual = perform_scan(<<-TEXT, /[a-z]+/)
|
47
|
+
for
|
48
|
+
23
|
49
|
+
answers
|
50
|
+
TEXT
|
51
|
+
actual.should have(2).matches
|
52
|
+
actual[0].should == ['for', 1]
|
53
|
+
actual[1].should == ['answers', 3]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "scan for tag" do
|
58
|
+
def perform_scan(content, tag)
|
59
|
+
ColdfusionSource.new("dc", content).scan_for_tag(tag) do |text, attributes, l|
|
60
|
+
{ :text => text, :attributes => attributes, :line_number => l }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
it "finds a tag with no attributes" do
|
65
|
+
actual = perform_scan("text <cfabort>more text", "cfabort")
|
66
|
+
actual.should have(1).match
|
67
|
+
actual.first[:text].should == "<cfabort>"
|
68
|
+
actual.first[:attributes].should == { }
|
69
|
+
actual.first[:line_number].should == 1
|
70
|
+
end
|
71
|
+
|
72
|
+
it "finds an XML-style self-closing tag with no attributes" do
|
73
|
+
actual = perform_scan("text <cfabort/>more text", "cfabort")
|
74
|
+
actual.should have(1).match
|
75
|
+
actual.first[:text].should == "<cfabort/>"
|
76
|
+
actual.first[:attributes].should == { }
|
77
|
+
actual.first[:line_number].should == 1
|
78
|
+
end
|
79
|
+
|
80
|
+
it "finds a single-line tag with attributes" do
|
81
|
+
actual = perform_scan("and then <cflog text='in the middle'> something happens", 'cflog')
|
82
|
+
actual.should have(1).match
|
83
|
+
actual.first[:text].should == "<cflog text='in the middle'>"
|
84
|
+
actual.first[:attributes].should have(1).attribute
|
85
|
+
actual.first[:attributes][:text].should == 'in the middle'
|
86
|
+
actual.first[:line_number].should == 1
|
87
|
+
end
|
88
|
+
|
89
|
+
it "finds a single-line self-closing tag with attributes" do
|
90
|
+
actual = perform_scan("and then <cflog text='in the middle'/> something happens", 'cflog')
|
91
|
+
actual.should have(1).match
|
92
|
+
actual.first[:text].should == "<cflog text='in the middle'/>"
|
93
|
+
actual.first[:attributes].should have(1).attribute
|
94
|
+
actual.first[:attributes][:text].should == 'in the middle'
|
95
|
+
actual.first[:line_number].should == 1
|
96
|
+
end
|
97
|
+
|
98
|
+
it "finds attributes which are surrounded by single quotes" do
|
99
|
+
actual = perform_scan("and then <cflog text='in the middle'/> something happens", 'cflog')
|
100
|
+
actual.should have(1).match
|
101
|
+
actual.first[:attributes].should have(1).attribute
|
102
|
+
actual.first[:attributes][:text].should == 'in the middle'
|
103
|
+
end
|
104
|
+
|
105
|
+
it "finds attributes which are surrounded by double quotes" do
|
106
|
+
actual = perform_scan(%q(and then <cflog text="in the middle"/> something happens), 'cflog')
|
107
|
+
actual.should have(1).match
|
108
|
+
actual.first[:attributes].should have(1).attribute
|
109
|
+
actual.first[:attributes][:text].should == 'in the middle'
|
110
|
+
end
|
111
|
+
|
112
|
+
it "finds multiple tags" do
|
113
|
+
actual = perform_scan(<<-CFM, "cfparam")
|
114
|
+
<cfparam name="foo" default="42">
|
115
|
+
<cfparam name="bar" default="11">
|
116
|
+
CFM
|
117
|
+
actual.should have(2).matches
|
118
|
+
actual[0][:attributes].should == { :name => 'foo', :default => '42' }
|
119
|
+
actual[1][:attributes].should == { :name => 'bar', :default => '11' }
|
120
|
+
actual[1][:line_number].should == 2
|
121
|
+
end
|
122
|
+
|
123
|
+
it "finds tags that are spread over multiple lines" do
|
124
|
+
actual = perform_scan(<<-CFM, "cfmodule")
|
125
|
+
<html>
|
126
|
+
<title>
|
127
|
+
<cfmodule
|
128
|
+
name="whatever"
|
129
|
+
>
|
130
|
+
</title></html>
|
131
|
+
CFM
|
132
|
+
actual.should have(1).match
|
133
|
+
actual.first[:attributes].should == { :name => 'whatever' }
|
134
|
+
end
|
135
|
+
|
136
|
+
it "is flexible about whitespace around '='" do
|
137
|
+
actual = perform_scan(<<-CFM, "cfparam")
|
138
|
+
<cfparam name ="foo" default= "42">
|
139
|
+
<cfparam name="bar" default = "11">
|
140
|
+
CFM
|
141
|
+
actual.should have(2).matches
|
142
|
+
actual[0][:attributes].should == { :name => 'foo', :default => '42' }
|
143
|
+
actual[1][:attributes].should == { :name => 'bar', :default => '11' }
|
144
|
+
actual[1][:line_number].should == 2
|
145
|
+
end
|
146
|
+
|
147
|
+
it "downcases attribute keys" do
|
148
|
+
actual = perform_scan(%q(<cfabort NOW='later'>), 'cfabort')
|
149
|
+
actual.first[:attributes].keys.should include(:now)
|
150
|
+
end
|
151
|
+
|
152
|
+
it "matches tags without regard to case" do
|
153
|
+
actual = perform_scan(%q(Time to go <CFABORT/>), 'cfAbort')
|
154
|
+
actual.should have(1).matches
|
155
|
+
actual.first[:text].should == '<CFABORT/>'
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
end # module
|
161
|
+
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[spec_helper])
|
2
|
+
|
3
|
+
describe CaseCheck::Params do
|
4
|
+
def config_file(filename, contents)
|
5
|
+
FileUtils.mkdir_p File.dirname(filename)
|
6
|
+
File.open(filename, 'w') { |f| f.write contents }
|
7
|
+
end
|
8
|
+
|
9
|
+
def actual_params(*argv)
|
10
|
+
CaseCheck::Params.new(argv.flatten)
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "--dir directory" do
|
14
|
+
before do
|
15
|
+
@dirname = "/tmp/cftest"
|
16
|
+
FileUtils.mkdir_p @dirname
|
17
|
+
end
|
18
|
+
|
19
|
+
after do
|
20
|
+
FileUtils.rm_rf @dirname
|
21
|
+
end
|
22
|
+
|
23
|
+
it "makes the directory available" do
|
24
|
+
actual = actual_params('--dir', @dirname)
|
25
|
+
actual.directory.should == @dirname
|
26
|
+
end
|
27
|
+
|
28
|
+
it "defaults the directory to the current" do
|
29
|
+
actual_params.directory.should == '.'
|
30
|
+
end
|
31
|
+
|
32
|
+
it "reads the configuration directory/cf_case_check.yml" do
|
33
|
+
config_file File.join(@dirname, "cf_case_check.yml"), <<-YAML
|
34
|
+
cfc_directories:
|
35
|
+
- /tmp/baz
|
36
|
+
YAML
|
37
|
+
actual_params('--dir', @dirname)
|
38
|
+
CaseCheck::Cfc.directories.should == %w(/tmp/baz)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "prefers an explicitly named configuration file if both are available" do
|
42
|
+
config_file File.join(@dirname, "cf_case_check.yml"), <<-YAML
|
43
|
+
cfc_directories:
|
44
|
+
- /tmp/quux
|
45
|
+
YAML
|
46
|
+
config_file File.join(@dirname, "another.yml"), <<-YAML
|
47
|
+
cfc_directories:
|
48
|
+
- /tmp/qurt
|
49
|
+
YAML
|
50
|
+
actual_params('--dir', @dirname, '--config', File.join(@dirname, 'another.yml'))
|
51
|
+
CaseCheck::Cfc.directories.should == %w(/tmp/qurt)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "--config filename" do
|
56
|
+
before do
|
57
|
+
@filename = "/tmp/foo.yml"
|
58
|
+
config_file @filename, <<-YAML
|
59
|
+
cfc_directories:
|
60
|
+
- /tmp/bar
|
61
|
+
YAML
|
62
|
+
CaseCheck::Cfc.directories = nil
|
63
|
+
end
|
64
|
+
|
65
|
+
after do
|
66
|
+
FileUtils.rm_rf @filename
|
67
|
+
end
|
68
|
+
|
69
|
+
it "loads the configuration" do
|
70
|
+
actual_params('--config', @filename)
|
71
|
+
CaseCheck::Cfc.directories.should == %w(/tmp/bar)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "--version" do
|
76
|
+
it "prints to configured stderr" do
|
77
|
+
CaseCheck.should_receive(:exit)
|
78
|
+
actual_params('--version')
|
79
|
+
CaseCheck.status_stream.string.should == "cf_case_check #{CaseCheck.version}\n"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "--help" do
|
84
|
+
it "prints to configured stderr" do
|
85
|
+
CaseCheck.should_receive(:exit)
|
86
|
+
actual_params('--help')
|
87
|
+
CaseCheck.status_stream.string.should include("cf_case_check")
|
88
|
+
CaseCheck.status_stream.string.should include("config")
|
89
|
+
CaseCheck.status_stream.string.should include("dir")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "--verbose" do
|
94
|
+
it "sets the verbose flag" do
|
95
|
+
actual_params('--verbose').should be_verbose
|
96
|
+
actual_params('-v').should be_verbose
|
97
|
+
end
|
98
|
+
|
99
|
+
it "does not set the verbose flag when omitted" do
|
100
|
+
actual_params.should_not be_verbose
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require File.join(File.dirname(__FILE__), %w[spec_helper])
|
3
|
+
|
4
|
+
describe CaseCheck::Configuration do
|
5
|
+
before do
|
6
|
+
@filename = "/tmp/cf_case_check/config.yml"
|
7
|
+
end
|
8
|
+
|
9
|
+
after do
|
10
|
+
if File.exist?(@filename)
|
11
|
+
FileUtils.rm_rf @filename
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def config_file(contents)
|
16
|
+
FileUtils.mkdir_p File.dirname(@filename)
|
17
|
+
File.open(@filename, 'w') { |f| f.write contents }
|
18
|
+
end
|
19
|
+
|
20
|
+
def read_config
|
21
|
+
CaseCheck::Configuration.new(@filename)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "reads custom tag directories" do
|
25
|
+
config_file <<-YAML
|
26
|
+
custom_tag_directories:
|
27
|
+
- /var/www/customtags
|
28
|
+
- /home/cf/customtags
|
29
|
+
YAML
|
30
|
+
read_config
|
31
|
+
CaseCheck::CustomTag.directories.should == %w(/var/www/customtags /home/cf/customtags)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "resolves relative custom tag directories against the config file directory" do
|
35
|
+
config_file <<-YAML
|
36
|
+
custom_tag_directories:
|
37
|
+
- zappo/customtags
|
38
|
+
YAML
|
39
|
+
read_config
|
40
|
+
CaseCheck::CustomTag.directories.should == %w(/tmp/cf_case_check/zappo/customtags)
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), %w[spec_helper])
|
4
|
+
|
5
|
+
describe File, ' extensions ' do
|
6
|
+
before do
|
7
|
+
@tmpdir = "/tmp/case_check_spec"
|
8
|
+
FileUtils.mkdir_p(File.dirname(@tmpdir))
|
9
|
+
end
|
10
|
+
|
11
|
+
after do
|
12
|
+
FileUtils.rm_rf(@tmpdir)
|
13
|
+
end
|
14
|
+
|
15
|
+
def touch(filename)
|
16
|
+
full = testfile(filename)
|
17
|
+
FileUtils.mkdir_p(File.dirname(full))
|
18
|
+
File.open(full, 'w') { }
|
19
|
+
full
|
20
|
+
end
|
21
|
+
|
22
|
+
def testfile(filename)
|
23
|
+
File.join(@tmpdir, filename)
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#exists_exactly?" do
|
27
|
+
it "does not include insensitive file matches" do
|
28
|
+
touch("some_file")
|
29
|
+
File.exists_exactly?(testfile("some_File")).should be_false
|
30
|
+
end
|
31
|
+
|
32
|
+
it "does not include insensitive directory matches" do
|
33
|
+
touch("Bar/quUx")
|
34
|
+
File.exists_exactly?(testfile("bAr/quUx")).should be_false
|
35
|
+
end
|
36
|
+
|
37
|
+
it "does not have a problem with files that don't exist at all" do
|
38
|
+
File.exists_exactly?(testfile("nope")).should be_false
|
39
|
+
end
|
40
|
+
|
41
|
+
it "does match exact file paths" do
|
42
|
+
touch("qUuX/foo")
|
43
|
+
File.exists_exactly?(testfile("qUuX/foo")).should be_true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#case_insensitive_canonical_name" do
|
48
|
+
it "finds exact matches" do
|
49
|
+
touch("baz/bar.foo")
|
50
|
+
File.case_insensitive_canonical_name(testfile("baz/bar.foo")).should == testfile("baz/bar.foo")
|
51
|
+
end
|
52
|
+
|
53
|
+
it "finds matches with case-insensitive matching directories" do
|
54
|
+
touch("baZ/baR/foo")
|
55
|
+
File.case_insensitive_canonical_name(testfile("baz/bar/foo")).should == testfile("baZ/baR/foo")
|
56
|
+
end
|
57
|
+
|
58
|
+
it "finds matches with case-insensitive matching filenames" do
|
59
|
+
touch("baz/bar/fOz")
|
60
|
+
File.case_insensitive_canonical_name(testfile("baz/bar/FOZ")).should == testfile("baz/bar/fOz")
|
61
|
+
end
|
62
|
+
|
63
|
+
it "finds no match for non-existent files" do
|
64
|
+
File.case_insensitive_canonical_name(testfile("quux")).should be_nil
|
65
|
+
end
|
66
|
+
|
67
|
+
it "handles path navigation" do
|
68
|
+
touch("baz/bar/foo/quux")
|
69
|
+
File.case_insensitive_canonical_name(testfile("baz/bar/quod/../fOO/quux")).should == testfile("baz/bar/foo/quux")
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), %w[spec_helper])
|
4
|
+
|
5
|
+
describe CaseCheck::Reference do
|
6
|
+
class SampleReference < CaseCheck::Reference
|
7
|
+
attr_accessor :expected_path, :resolved_to
|
8
|
+
|
9
|
+
def initialize(expected_path, resolved_to, line=0, text=nil)
|
10
|
+
self.expected_path = expected_path
|
11
|
+
self.resolved_to = resolved_to
|
12
|
+
self.line = line
|
13
|
+
self.text = text
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'default resolution' do
|
18
|
+
it 'is exact when resolved_to ends with expected_path' do
|
19
|
+
SampleReference.new("/foo/patient.cfm", "/home/cfcode/apps/notis/foo/patient.cfm").resolution.should == :exact
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'is exact when resolved_to ends with expected_path, disregarding ../.' do
|
23
|
+
SampleReference.new(".././foo/patient.cfm", "/home/cfcode/apps/notis/foo/patient.cfm").resolution.should == :exact
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'is case sensitive when resolved_to ends with something else' do
|
27
|
+
SampleReference.new("/foo/Patient.cfm", "/home/cfcode/apps/notis/foo/patient.cfm").resolution.should == :case_insensitive
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'is unresolved without resolved_to' do
|
31
|
+
SampleReference.new("/foo/patient.cfm", nil).resolution.should be_nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'default message' do
|
36
|
+
it "indicates when it is unresolved" do
|
37
|
+
SampleReference.new("/foo/patient.cfm", nil, 11, "FOO_Patient").message.should ==
|
38
|
+
"Unresolved sample reference on line 11: FOO_Patient"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "indicates when it is exactly resolved" do
|
42
|
+
SampleReference.new("/foo/patient.cfm", "/home/cfcode/apps/notis/foo/patient.cfm", 11, "foo_patient").message.should ==
|
43
|
+
"Exactly resolved sample reference on line 11 from foo_patient to /home/cfcode/apps/notis/foo/patient.cfm"
|
44
|
+
end
|
45
|
+
|
46
|
+
it "indicates when it is only case-insensitively resolved" do
|
47
|
+
SampleReference.new("/foo/Patient.cfm", "/home/cfcode/apps/notis/foo/patient.cfm", 11, "foo_Patient").message.should ==
|
48
|
+
"Case-insensitively resolved sample reference on line 11 from foo_Patient to /home/cfcode/apps/notis/foo/patient.cfm"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require File.expand_path('../spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe CaseCheck::Cfc do
|
4
|
+
before(:each) do
|
5
|
+
CaseCheck::Cfc.directories = %w(/tmp/cfc_specs/components)
|
6
|
+
@source = create_test_source('/tmp/cfc_specs/theapp/quux.cfm', <<-CFM)
|
7
|
+
<cfparam name="url.summaryType">
|
8
|
+
<cfparam name="url.patient_id">
|
9
|
+
<cfparam name="url.summaryId" default="0">
|
10
|
+
|
11
|
+
<cfscript>
|
12
|
+
utilsObj = CreateObject("component","bspore.Utils").init(datasource=application.personnel_db,username=session.netid,userIP=cgi.remote_addr);
|
13
|
+
summaryObj = createObject("component","bspore.Summary").init(datasource=application.db,username=session.netid,userIP=cgi.remote_addr);
|
14
|
+
</cfscript>
|
15
|
+
CFM
|
16
|
+
end
|
17
|
+
|
18
|
+
after(:each) do
|
19
|
+
FileUtils.rm_r '/tmp/cfc_specs'
|
20
|
+
end
|
21
|
+
|
22
|
+
def actual_search
|
23
|
+
CaseCheck::Cfc.search(@source)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "has a human-readable name" do
|
27
|
+
actual_search.first.type_name.should == 'cfc'
|
28
|
+
end
|
29
|
+
|
30
|
+
it "finds multiple invocations" do
|
31
|
+
actual_search.should have(2).references
|
32
|
+
end
|
33
|
+
|
34
|
+
it "finds lower case createObject style" do
|
35
|
+
actual_search.last.expected_path.should == "bspore/Summary.cfc"
|
36
|
+
end
|
37
|
+
|
38
|
+
it "finds upper case CreateObject style" do
|
39
|
+
actual_search.first.expected_path.should == "bspore/Utils.cfc"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "resolves against an exact match" do
|
43
|
+
expected_file = CaseCheck::Cfc.directories.last + "/bspore/Utils.cfc"
|
44
|
+
touch expected_file
|
45
|
+
actual_search.first.resolved_to.should == expected_file
|
46
|
+
actual_search.first.resolution.should == :exact
|
47
|
+
end
|
48
|
+
|
49
|
+
it "resolves against an all-lowercase match as exact" do
|
50
|
+
expected_file = CaseCheck::Cfc.directories.last + "/bspore/utils.cfc"
|
51
|
+
touch expected_file
|
52
|
+
actual_search.first.resolved_to.should == expected_file
|
53
|
+
actual_search.first.resolution.should == :exact
|
54
|
+
end
|
55
|
+
|
56
|
+
it "resolves against an differently cased version as inexact" do
|
57
|
+
expected_file = CaseCheck::Cfc.directories.last + "/BSpore/Utils.cfc"
|
58
|
+
touch expected_file
|
59
|
+
actual_search.first.resolved_to.should == expected_file
|
60
|
+
actual_search.first.resolution.should == :case_insensitive
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require File.expand_path('../spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe CaseCheck::Cfinclude do
|
4
|
+
before(:each) do
|
5
|
+
@source = create_test_source("/tmp/cfinc_specs/theapp/quux.cfm", <<-CFM)
|
6
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
|
7
|
+
"http://www.w3.org/TR/REC-html40/loose.dtd">
|
8
|
+
<HTML>
|
9
|
+
<HEAD>
|
10
|
+
<TITLE>Pick Permissions Report Options</TITLE>
|
11
|
+
<META NAME="generator" CONTENT="BBEdit 5.1.1">
|
12
|
+
|
13
|
+
<CFPARAM NAME="Session.Output_Type" DEFAULT="Browser">
|
14
|
+
|
15
|
+
<cfinclude template="../header_plain.html">
|
16
|
+
<h1>Pick Permissions Report Options</h1>
|
17
|
+
|
18
|
+
CFM
|
19
|
+
end
|
20
|
+
|
21
|
+
after(:each) do
|
22
|
+
FileUtils.rm_r '/tmp/cfinc_specs'
|
23
|
+
end
|
24
|
+
|
25
|
+
def actual_search
|
26
|
+
CaseCheck::Cfinclude.search(@source)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "has a human-readable name" do
|
30
|
+
actual_search.first.type_name.should == 'cfinclude'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "uses the template path as the path" do
|
34
|
+
actual_search.first.expected_path.should == "../header_plain.html"
|
35
|
+
end
|
36
|
+
|
37
|
+
it "resolves against file directory" do
|
38
|
+
expected_file = "/tmp/cfinc_specs/header_plain.html"
|
39
|
+
touch expected_file
|
40
|
+
actual_search.first.resolved_to.should == expected_file
|
41
|
+
actual_search.first.resolution.should == :exact
|
42
|
+
end
|
43
|
+
|
44
|
+
it "resolves against file directory case-insensitively" do
|
45
|
+
expected_file = "/tmp/cfinc_specs/headER_plain.html"
|
46
|
+
touch expected_file
|
47
|
+
actual_search.first.resolved_to.should == expected_file
|
48
|
+
actual_search.first.resolution.should == :case_insensitive
|
49
|
+
end
|
50
|
+
|
51
|
+
it "finds multiple cfincludes" do
|
52
|
+
@source.content = <<-CFM
|
53
|
+
<cfinclude template="etc"/>
|
54
|
+
And then something else happened.
|
55
|
+
<cfinclude template="etal">
|
56
|
+
CFM
|
57
|
+
actual_search.should have(2).references
|
58
|
+
end
|
59
|
+
|
60
|
+
it "finds the cfinclude tag without regard to case" do
|
61
|
+
@source.content = <<-CFM
|
62
|
+
<CFInclude template="whatever">
|
63
|
+
CFM
|
64
|
+
actual_search.should have(1).reference
|
65
|
+
end
|
66
|
+
end
|