rakismet 0.4.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -1
- data/README.md +115 -91
- data/Rakefile +6 -6
- data/VERSION.yml +3 -3
- data/lib/rakismet.rb +73 -55
- data/lib/rakismet/middleware.rb +16 -0
- data/lib/rakismet/model.rb +27 -25
- data/lib/rakismet/railtie.rb +19 -0
- data/spec/.rspec +1 -0
- data/spec/rakismet_middleware_spec.rb +27 -0
- data/spec/{models/rakismet_model_spec.rb → rakismet_model_spec.rb} +63 -58
- data/spec/rakismet_spec.rb +80 -0
- data/spec/spec_helper.rb +4 -15
- metadata +14 -20
- data/generators/rakismet/rakismet_generator.rb +0 -7
- data/generators/rakismet/templates/config/initializers/rakismet.rb +0 -3
- data/install.rb +0 -7
- data/lib/rakismet/controller.rb +0 -20
- data/lib/rakismet/filter.rb +0 -10
- data/spec/controllers/rakismet_controller_spec.rb +0 -43
- data/spec/models/base_spec.rb +0 -77
- data/spec/models/rakismet_filter_spec.rb +0 -24
- data/spec/spec.opts +0 -6
- data/uninstall.rb +0 -1
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -2,68 +2,72 @@ Rakismet
|
|
2
2
|
========
|
3
3
|
|
4
4
|
**Akismet** (<http://akismet.com/>) is a collaborative spam filtering service.
|
5
|
-
**Rakismet** is easy Akismet integration with
|
6
|
-
|
5
|
+
**Rakismet** is easy Akismet integration with Rails and rack apps. TypePad's
|
6
|
+
AntiSpam service and generic Akismet endpoints are supported.
|
7
7
|
|
8
|
+
Compatibility
|
9
|
+
=============
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
+
**Rakismet 1.0.0** works with Rails 3 and other Rack-based frameworks.
|
12
|
+
**Rakismet 0.4.2** is compatible with Rails 2.
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
+
Getting Started
|
15
|
+
===============
|
14
16
|
|
15
|
-
|
17
|
+
Once you've installed the Rakismet gem and added it to your application's Gemfile,
|
18
|
+
you'll need an API key from the folks at WordPress. Head on over to
|
19
|
+
http://wordpress.com/api-keys/ and sign up for a new username.
|
16
20
|
|
17
|
-
Rakismet
|
18
|
-
|
19
|
-
vendor/plugins/rakismet/generators/rakismet/templates/config/initializers/rakismet.rb.
|
21
|
+
Configure the Rakismet key and the URL of your application by setting the following
|
22
|
+
in an initializer or application.rb:
|
20
23
|
|
21
|
-
|
22
|
-
|
24
|
+
config.rakismet.key = 'your wordpress key'
|
25
|
+
config.rakismet.url = 'http://yourdomain.com/'
|
23
26
|
|
24
|
-
|
27
|
+
If you wish to use another Akismet-compatible API provider such as TypePad's
|
28
|
+
antispam service, you'll also need to set `config.rakismet.host` to your service
|
29
|
+
provider's endpoint.
|
25
30
|
|
26
|
-
|
27
|
-
|
31
|
+
Checking For Spam
|
32
|
+
-----------------
|
28
33
|
|
29
|
-
|
30
|
-
initializer.
|
34
|
+
First, introduce Rakismet to your model:
|
31
35
|
|
32
|
-
|
33
|
-
|
36
|
+
class Comment
|
37
|
+
include Rakismet::Model
|
38
|
+
end
|
34
39
|
|
35
|
-
|
36
|
-
|
37
|
-
and sign up for a new username.
|
40
|
+
With Rakismet mixed in to your model, you'll get three methods for interacting with
|
41
|
+
Akismet:
|
38
42
|
|
39
|
-
|
40
|
-
`Rakismet::KEY` with the URL of your application and the key you received
|
41
|
-
from WordPress.
|
43
|
+
* `spam?`
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
-
service provider's endpoint.
|
45
|
+
Simply call `@comment.spam?` to get a true/false response. True means it's spam,
|
46
|
+
false means it's not.
|
46
47
|
|
47
|
-
|
48
|
-
|
48
|
+
* `ham!` and
|
49
|
+
* `spam!`
|
49
50
|
|
50
|
-
|
51
|
+
Akismet works best with your feedback. If you spot a comment that was
|
52
|
+
erroneously marked as spam, `@comment.ham!` will resubmit to Akismet, marked
|
53
|
+
as a false positive. Likewise if they missed a spammy comment,
|
54
|
+
`@comment.spam!` will resubmit marked as spam.
|
51
55
|
|
52
|
-
|
53
|
-
|
54
|
-
|
56
|
+
|
57
|
+
Configuring Your Model
|
58
|
+
----------------------
|
55
59
|
|
56
60
|
Rakismet sends the following information to the spam-hungry robots at Akismet:
|
57
61
|
|
58
62
|
author : name submitted with the comment
|
59
63
|
author_url : URL submitted with the comment
|
60
64
|
author_email : email submitted with the comment
|
61
|
-
comment_type :
|
65
|
+
comment_type : Defaults to comment but you can set it to trackback, pingback, or something more appropriate
|
62
66
|
content : the content submitted
|
63
67
|
permalink : the permanent URL for the entry the comment belongs to
|
64
68
|
user_ip : IP address used to submit this comment
|
65
69
|
user_agent : user agent string
|
66
|
-
referrer :
|
70
|
+
referrer : referring URL (note the spelling)
|
67
71
|
|
68
72
|
By default, Rakismet just looks for attributes or methods on your class that
|
69
73
|
match these names. You don't have to have accessors that match these exactly,
|
@@ -85,72 +89,92 @@ Or you can pass in a proc, to access associations:
|
|
85
89
|
:author_email => proc { author.email }
|
86
90
|
end
|
87
91
|
|
88
|
-
|
89
|
-
--------------------
|
90
|
-
Perhaps you want to check a comment's spam status at creation time, and you
|
91
|
-
have no need to keep track of request-specific information such as the user's
|
92
|
-
IP, user agent, or referrer.
|
92
|
+
You can even hard-code specific fields:
|
93
93
|
|
94
|
-
|
95
|
-
|
94
|
+
class Trackback
|
95
|
+
include Rakismet::Model
|
96
|
+
rakismet_attrs :comment_type => "trackback"
|
97
|
+
end
|
96
98
|
|
97
|
-
|
98
|
-
|
99
|
-
end
|
99
|
+
Optional Request Variables
|
100
|
+
--------------------------
|
100
101
|
|
101
|
-
|
102
|
-
|
103
|
-
|
102
|
+
Akismet wants certain information about the request environment: remote IP, the
|
103
|
+
user agent string, and the HTTP referer when available. Normally, Rakismet
|
104
|
+
asks your model for these. Storing this information on your model allows you to
|
105
|
+
call the `spam?` method at a later time. For instance, maybe you're storing your
|
106
|
+
comments in an administrative queue or processing them with a background job.
|
104
107
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
end
|
108
|
+
You don't need to have these three attributes on your model, however. If you
|
109
|
+
choose to omit them, Rakismet will instead look at the current request (if one
|
110
|
+
exists) and take the values from the request object instead.
|
109
111
|
|
110
|
-
|
111
|
-
|
112
|
+
This means that if you are **not storing the request variables**, you must call
|
113
|
+
`spam?` from within the controller action that handles comment submissions. That
|
114
|
+
way the IP, user agent, and referer will belong to the person submitting the
|
115
|
+
comment. If you're not storing the request variables and you call `spam?` at a later
|
116
|
+
time, the request information will be missing or invalid and Akismet won't be
|
117
|
+
able to do its job properly.
|
112
118
|
|
113
|
-
|
119
|
+
If you've decided to handle the request variables yourself, you can add this to your
|
120
|
+
app initialization to disable the middleware responsible for tracking the request
|
121
|
+
information:
|
114
122
|
|
115
|
-
|
123
|
+
config.rakismet.use_middleware = false
|
116
124
|
|
117
|
-
|
118
|
-
|
119
|
-
this happens. You can check `@comment.akismet_response` to be certain;
|
120
|
-
anything other than 'true' or 'false' means you got an error. That said, as
|
121
|
-
long as you're collecting the data listed above it's probably sufficient to
|
122
|
-
check `spam?` alone.
|
123
|
-
|
124
|
-
Keep in mind that if you call `spam?` from within a controller action that
|
125
|
-
uses the Rakismet filter, the user IP, user agent, and referrer will be taken
|
126
|
-
from the current request regardless of what your model attributes are. In
|
127
|
-
other words: if you're not verifying comments at the moment they're submitted,
|
128
|
-
you probably want to store those attributes rather than rely on the controller
|
129
|
-
methods.
|
130
|
-
|
131
|
-
* `ham!` and
|
132
|
-
* `spam!`
|
125
|
+
Verifying Responses
|
126
|
+
-------------------
|
133
127
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
128
|
+
If you want to see what's happening behind the scenes, after you call one of
|
129
|
+
`@comment.spam?`, `@comment.spam!` or `@comment.ham!` you can check
|
130
|
+
`@comment.akismet_response`.
|
131
|
+
|
132
|
+
This will contain the last response from the Akismet server. In the case of `spam?`
|
133
|
+
it should be `true` or `false.` For `spam!` and `ham!` it should be `Feedback received.`
|
134
|
+
If Akismet returned an error instead (e.g. if you left out some required information)
|
135
|
+
this will contain the error message.
|
136
|
+
|
137
|
+
FAQ
|
138
|
+
===
|
139
|
+
|
140
|
+
Why does Akismet think all of my test data is spam?
|
141
|
+
---------------------------------------------------
|
142
|
+
|
143
|
+
Akismet needs enough information to decide if your test data is spam or not.
|
144
|
+
Try to supply as much as possible, especially the author name and request
|
145
|
+
variables.
|
146
|
+
|
147
|
+
How can I simulate a spam submission?
|
148
|
+
-------------------------------------
|
149
|
+
|
150
|
+
Most people have the opposite problem, where Akismet doesn't think anything is
|
151
|
+
spam. The only guaranteed way to trigger a positive spam response is to set the
|
152
|
+
comment author to "viagra-test-123".
|
153
|
+
|
154
|
+
If you've done this and `spam?` is still returning false, you're probably
|
155
|
+
missing the user IP or one of the key/url config variables. One way to check is
|
156
|
+
to call `@comment.akismet_response`. If you are missing a required field or
|
157
|
+
there was another error, this will hold the Akismet error message. If your comment
|
158
|
+
was processed normally, this value will simply be `true` or `false`.
|
159
|
+
|
160
|
+
Can I use Rakismet with a different ORM or framework?
|
161
|
+
-----------------------------------------------------
|
162
|
+
|
163
|
+
Sure. Rakismet doesn't care what your persistence layer is. It will work with
|
164
|
+
Datamapper, a NoSQL store, or whatever next month's DB flavor is.
|
165
|
+
|
166
|
+
Rakismet also has no dependencies on Rails or any of its components, and only uses
|
167
|
+
a small Rack middleware object to do some of its magic. Depending on your
|
168
|
+
framework, you may have to modify this slightly and/or manually place it in your
|
169
|
+
stack.
|
138
170
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
to make Rakismet easier to use with persistence layers other than
|
143
|
-
ActiveRecord.
|
171
|
+
You'll also need to set a few config variables by hand. Instead of
|
172
|
+
`config.rakismet.key`, `config.rakismet.url`, and `config.rakismet.host`, set
|
173
|
+
these values directly with `Rakismet.key`, `Rakismet.url`, and `Rakismet.host`.
|
144
174
|
|
145
|
-
|
175
|
+
---------------------------------------------------------------------------
|
146
176
|
|
147
|
-
|
148
|
-
|
149
|
-
`include Rakismet::Model` and `include Rakismet::Controller`.
|
150
|
-
* `ActiveRecord::Base#has_rakismet` now becomes
|
151
|
-
`Rakismet::Model#rakismet_attrs`.
|
152
|
-
* `ActionController::Base#has_rakismet` now becomes
|
153
|
-
`Rakismet::Controller#rakismet_filter`.
|
177
|
+
If you have any implementation or usage questions, don't hesitate to get in
|
178
|
+
touch: josh@vitamin-j.com.
|
154
179
|
|
155
|
-
--------------------------------------------------------------
|
156
180
|
Copyright (c) 2008 Josh French, released under the MIT license
|
data/Rakefile
CHANGED
@@ -17,10 +17,10 @@ rescue LoadError
|
|
17
17
|
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
18
18
|
end
|
19
19
|
|
20
|
-
require 'spec/rake/spectask'
|
21
|
-
Spec::Rake::SpecTask.new(:spec) do |spec|
|
22
|
-
spec.libs << 'lib' << 'spec'
|
23
|
-
spec.spec_files = FileList['spec/**/*_spec.rb']
|
24
|
-
end
|
20
|
+
#require 'spec/rake/spectask'
|
21
|
+
#Spec::Rake::SpecTask.new(:spec) do |spec|
|
22
|
+
# spec.libs << 'lib' << 'spec'
|
23
|
+
# spec.spec_files = FileList['spec/**/*_spec.rb']
|
24
|
+
#end
|
25
25
|
|
26
|
-
task :default => :spec
|
26
|
+
#task :default => :spec
|
data/VERSION.yml
CHANGED
data/lib/rakismet.rb
CHANGED
@@ -1,70 +1,88 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
require 'uri'
|
3
|
+
require 'cgi'
|
3
4
|
require 'yaml'
|
4
5
|
|
5
6
|
require 'rakismet/model'
|
6
|
-
require 'rakismet/
|
7
|
-
|
7
|
+
require 'rakismet/middleware'
|
8
|
+
|
9
|
+
require 'rakismet/railtie.rb' if defined?(Rails)
|
8
10
|
|
9
11
|
module Rakismet
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
Request = Struct.new(:user_ip, :user_agent, :referrer)
|
13
|
+
Undefined = Class.new(NameError)
|
14
|
+
|
15
|
+
class << self
|
16
|
+
attr_accessor :key, :url, :host
|
17
|
+
|
18
|
+
def request
|
19
|
+
@request ||= Request.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def set_request_vars(env)
|
23
|
+
request.user_ip, request.user_agent, request.referrer =
|
24
|
+
env['REMOTE_ADDR'], env['HTTP_USER_AGENT'], env['HTTP_REFERER']
|
14
25
|
end
|
15
|
-
end
|
16
26
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
data = "key=#{Rakismet::KEY}&blog=#{Rakismet::URL}"
|
26
|
-
http.post(akismet.path, data, Rakismet::HEADERS)
|
27
|
-
end
|
28
|
-
self.valid_key = (valid == 'valid')
|
27
|
+
def clear_request
|
28
|
+
@request = Request.new
|
29
|
+
end
|
30
|
+
|
31
|
+
def version
|
32
|
+
@version ||= begin
|
33
|
+
version = YAML.load_file(File.join(File.dirname(__FILE__), %w(.. VERSION.yml)))
|
34
|
+
[version[:major], version[:minor], version[:patch]].join('.')
|
29
35
|
end
|
30
|
-
|
31
|
-
|
32
|
-
|
36
|
+
end
|
37
|
+
|
38
|
+
def headers
|
39
|
+
@headers ||= begin
|
40
|
+
user_agent = "Rakismet/#{Rakismet.version}"
|
41
|
+
user_agent = "Rails/#{Rails.version} | " + user_agent if defined?(Rails)
|
42
|
+
{ 'User-Agent' => user_agent, 'Content-Type' => 'application/x-www-form-urlencoded' }
|
33
43
|
end
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
43
|
-
response
|
44
|
+
end
|
45
|
+
|
46
|
+
def validate_key
|
47
|
+
validate_config
|
48
|
+
akismet = URI.parse(verify_url)
|
49
|
+
_, valid = Net::HTTP.start(akismet.host) do |http|
|
50
|
+
data = "key=#{Rakismet.key}&blog=#{Rakismet.url}"
|
51
|
+
http.post(akismet.path, data, Rakismet.headers)
|
44
52
|
end
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
53
|
+
@valid_key = (valid == 'valid')
|
54
|
+
end
|
55
|
+
|
56
|
+
def valid_key?
|
57
|
+
@valid_key == true
|
58
|
+
end
|
59
|
+
|
60
|
+
def akismet_call(function, args={})
|
61
|
+
validate_config
|
62
|
+
args.merge!(:blog => Rakismet.url)
|
63
|
+
akismet = URI.parse(call_url(function))
|
64
|
+
_, response = Net::HTTP.start(akismet.host) do |http|
|
65
|
+
data = args.map { |k,v| "#{k}=#{CGI.escape(v.to_s)}" }.join('&')
|
66
|
+
http.post(akismet.path, data, Rakismet.headers)
|
67
|
+
end
|
68
|
+
response
|
69
|
+
end
|
70
|
+
|
71
|
+
protected
|
72
|
+
|
73
|
+
def verify_url
|
74
|
+
"http://#{Rakismet.host}/1.1/verify-key"
|
75
|
+
end
|
76
|
+
|
77
|
+
def call_url(function)
|
78
|
+
"http://#{Rakismet.key}.#{Rakismet.host}/1.1/#{function}"
|
79
|
+
end
|
80
|
+
|
81
|
+
def validate_config
|
82
|
+
raise Undefined, "Rakismet.key is not defined" if Rakismet.key.nil? || Rakismet.key.empty?
|
83
|
+
raise Undefined, "Rakismet.url is not defined" if Rakismet.url.nil? || Rakismet.url.empty?
|
84
|
+
raise Undefined, "Rakismet.host is not defined" if Rakismet.host.nil? || Rakismet.host.empty?
|
61
85
|
end
|
62
86
|
end
|
63
|
-
|
64
|
-
Undefined = Class.new(NameError)
|
65
|
-
|
66
|
-
HEADERS = {
|
67
|
-
'User-Agent' => "Rails/#{Rails::VERSION::STRING} | Rakismet/#{Rakismet.version}",
|
68
|
-
'Content-Type' => 'application/x-www-form-urlencoded'
|
69
|
-
}
|
87
|
+
|
70
88
|
end
|
data/lib/rakismet/model.rb
CHANGED
@@ -4,7 +4,7 @@ module Rakismet
|
|
4
4
|
def self.included(base)
|
5
5
|
base.class_eval do
|
6
6
|
attr_accessor :akismet_response
|
7
|
-
|
7
|
+
class << self; attr_accessor :akismet_attrs; end
|
8
8
|
extend ClassMethods
|
9
9
|
include InstanceMethods
|
10
10
|
self.rakismet_attrs
|
@@ -15,12 +15,12 @@ module Rakismet
|
|
15
15
|
def rakismet_attrs(args={})
|
16
16
|
self.akismet_attrs ||= {}
|
17
17
|
[:comment_type, :author, :author_url, :author_email, :content].each do |field|
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
# clunky, but throwing around +type+ will break your heart
|
19
|
+
fieldname = field.to_s =~ %r(^comment_) ? field : "comment_#{field}".intern
|
20
|
+
self.akismet_attrs[fieldname] = args.delete(field) || field
|
21
21
|
end
|
22
22
|
[:user_ip, :user_agent, :referrer].each do |field|
|
23
|
-
self.akismet_attrs[field] = args.delete(field)
|
23
|
+
self.akismet_attrs[field] = args.delete(field) || field
|
24
24
|
end
|
25
25
|
args.each_pair do |f,v|
|
26
26
|
self.akismet_attrs[f] = v
|
@@ -34,45 +34,47 @@ module Rakismet
|
|
34
34
|
@_spam
|
35
35
|
else
|
36
36
|
data = akismet_data
|
37
|
-
|
38
|
-
unless Rakismet::Base.current_request.nil?
|
39
|
-
{ :referrer => :referer, :user_ip => :remote_ip,
|
40
|
-
:user_agent => :user_agent }.each_pair do |k,v|
|
41
|
-
data[k] = Rakismet::Base.current_request.send(v) || ''
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
self.akismet_response = Rakismet::Base.akismet_call('comment-check', data)
|
37
|
+
self.akismet_response = Rakismet.akismet_call('comment-check', data)
|
46
38
|
@_spam = self.akismet_response == 'true'
|
47
39
|
end
|
48
40
|
end
|
49
41
|
|
50
42
|
def spam!
|
51
|
-
Rakismet
|
43
|
+
Rakismet.akismet_call('submit-spam', akismet_data)
|
52
44
|
@_spam = true
|
53
45
|
end
|
54
46
|
|
55
47
|
def ham!
|
56
|
-
Rakismet
|
48
|
+
Rakismet.akismet_call('submit-ham', akismet_data)
|
57
49
|
@_spam = false
|
58
50
|
end
|
59
51
|
|
60
52
|
private
|
61
53
|
|
62
54
|
def akismet_data
|
63
|
-
self.class.akismet_attrs.keys.inject({}) do |data,attr|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
55
|
+
akismet = self.class.akismet_attrs.keys.inject({}) do |data,attr|
|
56
|
+
mapped_field = self.class.akismet_attrs[attr]
|
57
|
+
data.merge attr => if mapped_field.is_a?(Proc)
|
58
|
+
instance_eval(&mapped_field)
|
59
|
+
elsif !mapped_field.nil? && respond_to?(mapped_field)
|
60
|
+
send(mapped_field)
|
61
|
+
elsif not [:comment_type, :author, :author_email,
|
62
|
+
:author_url, :content, :user_ip, :referrer,
|
63
|
+
:user_agent].include?(mapped_field)
|
64
|
+
# we've excluded any fields that appear to
|
65
|
+
# have their default unmapped values
|
66
|
+
mapped_field
|
70
67
|
elsif respond_to?(attr)
|
71
68
|
send(attr)
|
69
|
+
elsif Rakismet.request.respond_to?(attr)
|
70
|
+
Rakismet.request.send(attr)
|
72
71
|
end
|
73
|
-
end
|
72
|
+
end
|
73
|
+
akismet.delete_if { |k,v| v.nil? || v.empty? }
|
74
|
+
akismet[:comment_type] ||= 'comment'
|
75
|
+
akismet
|
74
76
|
end
|
75
77
|
end
|
76
78
|
|
77
79
|
end
|
78
|
-
end
|
80
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rails'
|
2
|
+
require 'rakismet'
|
3
|
+
|
4
|
+
module Rakismet
|
5
|
+
class Railtie < Rails::Railtie
|
6
|
+
|
7
|
+
config.rakismet = ActiveSupport::OrderedOptions.new
|
8
|
+
config.rakismet.host = 'rest.akismet.com'
|
9
|
+
config.rakismet.use_middleware = true
|
10
|
+
|
11
|
+
initializer 'rakismet.setup', :after => :load_config_initializers do |app|
|
12
|
+
Rakismet.key = app.config.rakismet.key
|
13
|
+
Rakismet.url = app.config.rakismet.url
|
14
|
+
Rakismet.host = app.config.rakismet.host
|
15
|
+
app.middleware.use Rakismet::Middleware if app.config.rakismet.use_middleware
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
data/spec/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe Rakismet::Middleware do
|
4
|
+
|
5
|
+
let(:env) { { 'REMOTE_ADDR' => '127.0.0.1', 'HTTP_USER_AGENT' => 'RSpec', 'HTTP_REFERER' => 'http://test.host/referrer' } }
|
6
|
+
let(:app) { double(:app, :call => nil) }
|
7
|
+
let(:request) { double(:request).as_null_object }
|
8
|
+
|
9
|
+
before do
|
10
|
+
@middleware = Rakismet::Middleware.new(app)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should set set Rakismet.request variables" do
|
14
|
+
Rakismet.stub(:request).and_return(request)
|
15
|
+
request.should_receive(:user_ip=).with('127.0.0.1')
|
16
|
+
request.should_receive(:user_agent=).with('RSpec')
|
17
|
+
request.should_receive(:referrer=).with('http://test.host/referrer')
|
18
|
+
@middleware.call(env)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should clear Rakismet.request after request is complete" do
|
22
|
+
@middleware.call(env)
|
23
|
+
Rakismet.request.user_ip.should be_nil
|
24
|
+
Rakismet.request.user_agent.should be_nil
|
25
|
+
Rakismet.request.referrer.should be_nil
|
26
|
+
end
|
27
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.dirname(__FILE__) + '
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
2
|
require 'ostruct'
|
3
3
|
|
4
4
|
class AkismetModel
|
@@ -16,23 +16,27 @@ describe AkismetModel do
|
|
16
16
|
@model = AkismetModel.new
|
17
17
|
comment_attrs.each_pair { |k,v| @model.stub!(k).and_return(v) }
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
it "should have default mappings" do
|
21
21
|
[:comment_type, :author, :author_email, :author_url, :content].each do |field|
|
22
22
|
fieldname = field.to_s =~ %r(^comment_) ? field : "comment_#{field}".intern
|
23
23
|
AkismetModel.akismet_attrs[fieldname].should eql(field)
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
27
|
-
it "should have
|
26
|
+
|
27
|
+
it "should have request mappings" do
|
28
28
|
[:user_ip, :user_agent, :referrer].each do |field|
|
29
|
-
AkismetModel.akismet_attrs.should
|
29
|
+
AkismetModel.akismet_attrs[field].should eql(field)
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
it "should populate comment type" do
|
34
|
+
@model.send(:akismet_data)[:comment_type].should == comment_attrs[:comment_type]
|
35
|
+
end
|
36
|
+
|
33
37
|
mapped_params = { :comment_type => :type2, :author => :author2, :content => :content2,
|
34
38
|
:author_email => :author_email2, :author_url => :author_url2 }
|
35
|
-
|
39
|
+
|
36
40
|
describe override = AkismetModel.subclass('Override') { rakismet_attrs(mapped_params.dup) } do
|
37
41
|
it "should override default mappings" do
|
38
42
|
[:comment_type, :author, :author_url, :author_email, :content].each do |field|
|
@@ -46,31 +50,32 @@ describe AkismetModel do
|
|
46
50
|
:referrer => :stored_referrer }
|
47
51
|
|
48
52
|
describe extended = AkismetModel.subclass('Extended') { rakismet_attrs(extended_params.dup) } do
|
49
|
-
|
53
|
+
|
50
54
|
before do
|
51
55
|
@extended = extended.new
|
52
56
|
attrs = comment_attrs(:stored_ip => '127.0.0.1', :stored_agent => 'RSpec', :stored_referrer => 'http://test.host/')
|
53
57
|
attrs.each_pair { |k,v| @extended.stub!(k).and_return(v) }
|
58
|
+
Rakismet.stub(:request).and_return(empty_request)
|
54
59
|
end
|
55
|
-
|
60
|
+
|
56
61
|
it "should extend optional mappings" do
|
57
62
|
[:user_ip, :user_agent, :referrer].each do |field|
|
58
63
|
extended.akismet_attrs[field].should eql(extended_params[field])
|
59
64
|
end
|
60
65
|
end
|
61
|
-
|
66
|
+
|
62
67
|
describe ".spam!" do
|
63
68
|
it "should use stored request vars if available" do
|
64
|
-
Rakismet
|
69
|
+
Rakismet.should_receive(:akismet_call).
|
65
70
|
with('submit-spam', akismet_attrs(:user_ip => '127.0.0.1', :user_agent => 'RSpec',
|
66
71
|
:referrer => 'http://test.host/'))
|
67
72
|
@extended.spam!
|
68
73
|
end
|
69
74
|
end
|
70
|
-
|
75
|
+
|
71
76
|
describe ".ham!" do
|
72
77
|
it "should use stored request vars if available" do
|
73
|
-
Rakismet
|
78
|
+
Rakismet.should_receive(:akismet_call).
|
74
79
|
with('submit-ham', akismet_attrs(:user_ip => '127.0.0.1', :user_agent => 'RSpec',
|
75
80
|
:referrer => 'http://test.host/'))
|
76
81
|
@extended.ham!
|
@@ -123,75 +128,75 @@ describe AkismetModel do
|
|
123
128
|
end
|
124
129
|
|
125
130
|
describe ".spam?" do
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
Rakismet
|
133
|
-
with('comment-check', akismet_attrs.merge(:user_ip => '127.0.0.1',
|
134
|
-
:user_agent => 'RSpec',
|
131
|
+
|
132
|
+
it "should use request variables from Rakismet.request if absent in model" do
|
133
|
+
[:user_ip, :user_agent, :referrer].each do |field|
|
134
|
+
@model.should_not respond_to(:field)
|
135
|
+
end
|
136
|
+
Rakismet.stub!(:request).and_return(request)
|
137
|
+
Rakismet.should_receive(:akismet_call).
|
138
|
+
with('comment-check', akismet_attrs.merge(:user_ip => '127.0.0.1',
|
139
|
+
:user_agent => 'RSpec',
|
135
140
|
:referrer => 'http://test.host/referrer'))
|
136
141
|
@model.spam?
|
137
142
|
end
|
138
|
-
|
143
|
+
|
139
144
|
it "should cache result of #spam?" do
|
140
|
-
Rakismet
|
145
|
+
Rakismet.should_receive(:akismet_call).once
|
141
146
|
@model.spam?
|
142
147
|
@model.spam?
|
143
148
|
end
|
144
149
|
|
145
150
|
it "should be true if comment is spam" do
|
146
|
-
Rakismet
|
151
|
+
Rakismet.stub!(:akismet_call).and_return('true')
|
147
152
|
@model.should be_spam
|
148
153
|
end
|
149
|
-
|
154
|
+
|
150
155
|
it "should be false if comment is not spam" do
|
151
|
-
Rakismet
|
156
|
+
Rakismet.stub!(:akismet_call).and_return('false')
|
152
157
|
@model.should_not be_spam
|
153
158
|
end
|
154
|
-
|
155
|
-
it "should set
|
156
|
-
Rakismet
|
159
|
+
|
160
|
+
it "should set akismet_response" do
|
161
|
+
Rakismet.stub!(:akismet_call).and_return('response')
|
157
162
|
@model.spam?
|
158
163
|
@model.akismet_response.should eql('response')
|
159
164
|
end
|
160
165
|
|
161
166
|
it "should not throw an error if request vars are missing" do
|
162
|
-
Rakismet
|
167
|
+
Rakismet.stub!(:request).and_return(empty_request)
|
163
168
|
lambda { @model.spam? }.should_not raise_error(NoMethodError)
|
164
169
|
end
|
165
170
|
end
|
166
|
-
|
171
|
+
|
167
172
|
describe StoredParams do
|
168
173
|
before do
|
169
|
-
Rakismet::Base.current_request = nil
|
170
174
|
@model = StoredParams.new
|
171
175
|
comment_attrs.each_pair { |k,v| @model.stub!(k).and_return(v) }
|
172
176
|
end
|
173
177
|
|
174
|
-
it "should use local values if Rakismet
|
175
|
-
|
176
|
-
@model.
|
177
|
-
@model.
|
178
|
+
it "should use local values even if Rakismet.request is populated" do
|
179
|
+
Rakismet.stub!(:request).and_return(request)
|
180
|
+
@model.user_ip = '192.168.0.1'
|
181
|
+
@model.user_agent = 'Rakismet'
|
182
|
+
@model.referrer = 'http://localhost/referrer'
|
178
183
|
|
179
|
-
Rakismet
|
180
|
-
with('comment-check', akismet_attrs.merge(:user_ip => '
|
181
|
-
:user_agent => '
|
182
|
-
:referrer => 'http://
|
184
|
+
Rakismet.should_receive(:akismet_call).
|
185
|
+
with('comment-check', akismet_attrs.merge(:user_ip => '192.168.0.1',
|
186
|
+
:user_agent => 'Rakismet',
|
187
|
+
:referrer => 'http://localhost/referrer'))
|
183
188
|
@model.spam?
|
184
189
|
end
|
185
190
|
end
|
186
191
|
|
187
192
|
describe ".spam!" do
|
188
193
|
it "should call Base.akismet_call with submit-spam" do
|
189
|
-
Rakismet
|
194
|
+
Rakismet.should_receive(:akismet_call).with('submit-spam', akismet_attrs)
|
190
195
|
@model.spam!
|
191
196
|
end
|
192
197
|
|
193
198
|
it "should mutate #spam?" do
|
194
|
-
Rakismet
|
199
|
+
Rakismet.stub!(:akismet_call)
|
195
200
|
@model.instance_variable_set(:@_spam, false)
|
196
201
|
@model.spam!
|
197
202
|
@model.should be_spam
|
@@ -200,42 +205,42 @@ describe AkismetModel do
|
|
200
205
|
|
201
206
|
describe ".ham!" do
|
202
207
|
it "should call Base.akismet_call with submit-ham" do
|
203
|
-
Rakismet
|
208
|
+
Rakismet.should_receive(:akismet_call).with('submit-ham', akismet_attrs)
|
204
209
|
@model.ham!
|
205
210
|
end
|
206
211
|
|
207
212
|
it "should mutate #spam?" do
|
208
|
-
Rakismet
|
213
|
+
Rakismet.stub!(:akismet_call)
|
209
214
|
@model.instance_variable_set(:@_spam, true)
|
210
215
|
@model.ham!
|
211
216
|
@model.should_not be_spam
|
212
217
|
end
|
213
218
|
end
|
214
|
-
|
219
|
+
|
215
220
|
private
|
216
|
-
|
221
|
+
|
217
222
|
def comment_attrs(attrs={})
|
218
223
|
{ :comment_type => 'test', :author => 'Rails test',
|
219
224
|
:author_email => 'test@test.host', :author_url => 'test.host',
|
220
|
-
:content => 'comment content', :blog => Rakismet
|
225
|
+
:content => 'comment content', :blog => Rakismet.url }.merge(attrs)
|
221
226
|
end
|
222
|
-
|
227
|
+
|
223
228
|
def akismet_attrs(attrs={})
|
224
229
|
{ :comment_type => 'test', :comment_author_email => 'test@test.host',
|
225
230
|
:comment_author => 'Rails test', :comment_author_url => 'test.host',
|
226
231
|
:comment_content => 'comment content' }.merge(attrs)
|
227
232
|
end
|
228
|
-
|
229
|
-
|
230
|
-
OpenStruct.new(:
|
233
|
+
|
234
|
+
let(:request) {
|
235
|
+
OpenStruct.new(:user_ip => '127.0.0.1',
|
231
236
|
:user_agent => 'RSpec',
|
232
|
-
:
|
233
|
-
|
237
|
+
:referrer => 'http://test.host/referrer')
|
238
|
+
}
|
234
239
|
|
235
|
-
|
236
|
-
OpenStruct.new(:
|
240
|
+
let(:empty_request) {
|
241
|
+
OpenStruct.new(:user_ip => nil,
|
237
242
|
:user_agent => nil,
|
238
|
-
:
|
239
|
-
|
243
|
+
:referrer => nil)
|
244
|
+
}
|
240
245
|
|
241
|
-
end
|
246
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe Rakismet do
|
4
|
+
|
5
|
+
let(:http) { double(:http, :to_ary => [nil, 'akismet response']).as_null_object }
|
6
|
+
|
7
|
+
after do
|
8
|
+
Rakismet.key = 'dummy-key'
|
9
|
+
Rakismet.url = 'test.localhost'
|
10
|
+
Rakismet.host = 'endpoint.localhost'
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".validate_config" do
|
14
|
+
it "should raise an error if key is not found" do
|
15
|
+
Rakismet.key = ''
|
16
|
+
lambda { Rakismet.send(:validate_config) }.should raise_error(Rakismet::Undefined)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should raise an error if url is not found" do
|
20
|
+
Rakismet.url = ''
|
21
|
+
lambda { Rakismet.send(:validate_config) }.should raise_error(Rakismet::Undefined)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should raise an error if host is not found" do
|
25
|
+
Rakismet.host = ''
|
26
|
+
lambda { Rakismet.send(:validate_config) }.should raise_error(Rakismet::Undefined)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe ".validate_key" do
|
31
|
+
it "should set @@valid_key = true if key is valid" do
|
32
|
+
Net::HTTP.stub!(:start).and_return([nil, 'valid'])
|
33
|
+
Rakismet.validate_key
|
34
|
+
Rakismet.valid_key?.should be_true
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should set @@valid_key = false if key is invalid" do
|
38
|
+
Net::HTTP.stub!(:start).and_return([nil, 'invalid'])
|
39
|
+
Rakismet.validate_key
|
40
|
+
Rakismet.valid_key?.should be_false
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should build url with host" do
|
44
|
+
host = "api.antispam.typepad.com"
|
45
|
+
Rakismet.host = host
|
46
|
+
Net::HTTP.should_receive(:start).with(host).and_yield(http)
|
47
|
+
Rakismet.validate_key
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe ".akismet_call" do
|
52
|
+
before do
|
53
|
+
Net::HTTP.stub(:start).and_yield(http)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should build url with API key for the correct host" do
|
57
|
+
host = 'api.antispam.typepad.com'
|
58
|
+
Rakismet.host = host
|
59
|
+
Net::HTTP.should_receive(:start).with("#{Rakismet.key}.#{host}")
|
60
|
+
Rakismet.send(:akismet_call, 'bogus-function')
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should post data to named function" do
|
64
|
+
http.should_receive(:post).with('/1.1/bogus-function', %r(foo=#{CGI.escape 'escape//this'}), Rakismet.headers)
|
65
|
+
Rakismet.send(:akismet_call, 'bogus-function', { :foo => 'escape//this' })
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should return response.body" do
|
69
|
+
#Net::HTTP.stub!(:start).and_return([nil, 'akismet response'])
|
70
|
+
Rakismet.send(:akismet_call, 'bogus-function').should eql('akismet response')
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should build query string when params are nil" do
|
74
|
+
lambda {
|
75
|
+
Rakismet.send(:akismet_call, 'bogus-function', { :nil_param => nil })
|
76
|
+
}.should_not raise_error(NoMethodError)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,21 +1,10 @@
|
|
1
|
-
|
2
|
-
require File.expand_path(File.dirname(__FILE__) + "/../../../../config/environment")
|
3
|
-
require 'spec'
|
4
|
-
require 'spec/rails'
|
5
|
-
|
6
|
-
Spec::Runner.configure do |config|
|
1
|
+
require File.expand_path "../lib/rakismet"
|
7
2
|
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.mock_with :rspec
|
8
5
|
end
|
9
6
|
|
10
7
|
class Class
|
11
|
-
# Creates a new subclass of self, with a name "under" our own name. Example:
|
12
|
-
#
|
13
|
-
# x = Foo::Bar.subclass('Zap'){}
|
14
|
-
# x.name # => Foo::Bar::Zap_1
|
15
|
-
# x.superclass.name # => Foo::Bar
|
16
|
-
#
|
17
|
-
# Removed from RSpec after 1.1.something; reproduced here because much of the
|
18
|
-
# spec suite was already written with dynamic class creation.
|
19
8
|
def subclass(base_name, &body)
|
20
9
|
klass = Class.new(self)
|
21
10
|
class_name = "#{self.name}_#{base_name}"
|
@@ -25,4 +14,4 @@ class Class
|
|
25
14
|
klass.instance_eval(&body)
|
26
15
|
klass
|
27
16
|
end
|
28
|
-
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rakismet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
-
|
9
|
-
|
10
|
-
version: 0.4.2
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Josh French
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-10-23 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -34,20 +34,15 @@ files:
|
|
34
34
|
- README.md
|
35
35
|
- Rakefile
|
36
36
|
- VERSION.yml
|
37
|
-
- generators/rakismet/rakismet_generator.rb
|
38
|
-
- generators/rakismet/templates/config/initializers/rakismet.rb
|
39
|
-
- install.rb
|
40
37
|
- lib/rakismet.rb
|
41
|
-
- lib/rakismet/
|
42
|
-
- lib/rakismet/filter.rb
|
38
|
+
- lib/rakismet/middleware.rb
|
43
39
|
- lib/rakismet/model.rb
|
44
|
-
-
|
45
|
-
- spec
|
46
|
-
- spec/
|
47
|
-
- spec/
|
48
|
-
- spec/
|
40
|
+
- lib/rakismet/railtie.rb
|
41
|
+
- spec/.rspec
|
42
|
+
- spec/rakismet_middleware_spec.rb
|
43
|
+
- spec/rakismet_model_spec.rb
|
44
|
+
- spec/rakismet_spec.rb
|
49
45
|
- spec/spec_helper.rb
|
50
|
-
- uninstall.rb
|
51
46
|
has_rdoc: true
|
52
47
|
homepage: http://github.com/joshfrench/rakismet
|
53
48
|
licenses: []
|
@@ -83,8 +78,7 @@ signing_key:
|
|
83
78
|
specification_version: 3
|
84
79
|
summary: Akismet and TypePad AntiSpam integration for Rails.
|
85
80
|
test_files:
|
86
|
-
- spec/
|
87
|
-
- spec/
|
88
|
-
- spec/
|
89
|
-
- spec/models/rakismet_model_spec.rb
|
81
|
+
- spec/rakismet_middleware_spec.rb
|
82
|
+
- spec/rakismet_model_spec.rb
|
83
|
+
- spec/rakismet_spec.rb
|
90
84
|
- spec/spec_helper.rb
|
data/install.rb
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
File.open(File.join(RAILS_ROOT, %w(config initializers rakismet.rb)) , 'w') do |f|
|
2
|
-
f.puts "Rakismet::KEY = ''"
|
3
|
-
f.puts "Rakismet::URL = ''"
|
4
|
-
f.puts "Rakismet::HOST = 'rest.akismet.com'"
|
5
|
-
end
|
6
|
-
|
7
|
-
puts "If you're updating from Rakismet < 0.4, please see the README for important changes to the API."
|
data/lib/rakismet/controller.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
module Rakismet
|
2
|
-
module Controller
|
3
|
-
|
4
|
-
def self.included(base)
|
5
|
-
base.class_eval do
|
6
|
-
extend ClassMethods
|
7
|
-
around_filter Rakismet::Filter
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
module ClassMethods
|
12
|
-
def rakismet_filter(opts={})
|
13
|
-
skip_filter Rakismet::Filter # in case we're inheriting/overriding an existing Rakismet filter
|
14
|
-
opts.assert_valid_keys(:only, :except)
|
15
|
-
self.around_filter Rakismet::Filter, opts
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
data/lib/rakismet/filter.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
-
|
3
|
-
ActionController::Routing::Routes.draw do |map|
|
4
|
-
map.connect ':controller/:action/:id'
|
5
|
-
end
|
6
|
-
|
7
|
-
class StubController < ActionController::Base
|
8
|
-
include Rakismet::Controller
|
9
|
-
def one ; render :nothing => true; end
|
10
|
-
def two ; render :nothing => true; end
|
11
|
-
end
|
12
|
-
|
13
|
-
describe StubController do
|
14
|
-
it "should add around_filter" do
|
15
|
-
StubController.filter_chain.map(&:method).should include(Rakismet::Filter)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe StubController.subclass('OnlyActions') { rakismet_filter(:only => :one) } do
|
20
|
-
|
21
|
-
it "should add around filter to specified actions" do
|
22
|
-
Rakismet::Base.should_receive(:current_request=).twice
|
23
|
-
get :one
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should not add around filter to unspecified actions" do
|
27
|
-
Rakismet::Base.should_not_receive(:current_request=)
|
28
|
-
get :two
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe StubController.subclass('ExceptActions') { rakismet_filter(:except => :one) } do
|
33
|
-
|
34
|
-
it "should not add around filter to specified actions" do
|
35
|
-
Rakismet::Base.should_not_receive(:current_request=)
|
36
|
-
get :one
|
37
|
-
end
|
38
|
-
|
39
|
-
it "should add around filter to other actions" do
|
40
|
-
Rakismet::Base.should_receive(:current_request=).twice
|
41
|
-
get :two
|
42
|
-
end
|
43
|
-
end
|
data/spec/models/base_spec.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
-
|
3
|
-
describe Rakismet::Base do
|
4
|
-
|
5
|
-
before :all do
|
6
|
-
load File.join(RAILS_ROOT, 'config', 'initializers', 'rakismet.rb')
|
7
|
-
end
|
8
|
-
|
9
|
-
describe ".validate_constants" do
|
10
|
-
it "should raise an error if key is not found" do
|
11
|
-
Rakismet::KEY = ""
|
12
|
-
lambda { Rakismet::Base.send(:validate_constants) }.should raise_error(Rakismet::Undefined)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should raise an error if url is not found" do
|
16
|
-
Rakismet::URL = ""
|
17
|
-
lambda { Rakismet::Base.send(:validate_constants) }.should raise_error(Rakismet::Undefined)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should raise an error if host is not found" do
|
21
|
-
Rakismet::HOST = ""
|
22
|
-
lambda { Rakismet::Base.send(:validate_constants) }.should raise_error(Rakismet::Undefined)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe ".validate_key" do
|
27
|
-
it "should set @@valid_key = true if key is valid" do
|
28
|
-
Net::HTTP.stub!(:start).and_return([nil, 'valid'])
|
29
|
-
Rakismet::Base.validate_key
|
30
|
-
Rakismet::Base.valid_key?.should be_true
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should set @@valid_key = false if key is invalid" do
|
34
|
-
Net::HTTP.stub!(:start).and_return([nil, 'invalid'])
|
35
|
-
Rakismet::Base.validate_key
|
36
|
-
Rakismet::Base.valid_key?.should be_false
|
37
|
-
end
|
38
|
-
|
39
|
-
it "should build url with host" do
|
40
|
-
host = "api.antispam.typepad.com"
|
41
|
-
Rakismet::HOST = host
|
42
|
-
Net::HTTP.should_receive(:start).with(host).and_yield(mock(:http).as_null_object)
|
43
|
-
Rakismet::Base.validate_key
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe ".akismet_call" do
|
48
|
-
before do
|
49
|
-
@http = mock(:http)
|
50
|
-
Net::HTTP.stub!(:start).and_yield(@http)
|
51
|
-
end
|
52
|
-
|
53
|
-
it "should build url with API key for the correct host" do
|
54
|
-
host = "api.antispam.typepad.com"
|
55
|
-
Rakismet::HOST = host
|
56
|
-
Net::HTTP.should_receive(:start).with("#{Rakismet::KEY}.#{host}").and_yield(mock(:http).as_null_object)
|
57
|
-
Rakismet::Base.send(:akismet_call, 'bogus-function')
|
58
|
-
end
|
59
|
-
|
60
|
-
it "should post data to named function" do
|
61
|
-
@http.should_receive(:post).with('/1.1/bogus-function', %r(foo=#{CGI.escape 'escape//this'}), Rakismet::HEADERS)
|
62
|
-
Rakismet::Base.send(:akismet_call, 'bogus-function', { :foo => 'escape//this' })
|
63
|
-
end
|
64
|
-
|
65
|
-
it "should return response.body" do
|
66
|
-
Net::HTTP.stub!(:start).and_return([nil, 'akismet response'])
|
67
|
-
Rakismet::Base.send(:akismet_call, 'bogus-function').should eql('akismet response')
|
68
|
-
end
|
69
|
-
|
70
|
-
it "should build query string when params are nil" do
|
71
|
-
lambda {
|
72
|
-
Rakismet::Base.send(:akismet_call, 'bogus-function', { :nil_param => nil })
|
73
|
-
}.should_not raise_error(NoMethodError)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
-
|
3
|
-
Rakismet::TestingError = Class.new(StandardError)
|
4
|
-
|
5
|
-
describe Rakismet::Base do
|
6
|
-
before do
|
7
|
-
@request = mock('request')
|
8
|
-
@controller = mock('controller', :request => @request)
|
9
|
-
end
|
10
|
-
|
11
|
-
it "should set Rakismet::Base.current_request" do
|
12
|
-
Rakismet::Base.should_receive(:current_request=).with(@request).ordered
|
13
|
-
Rakismet::Base.should_receive(:current_request=).with(nil).ordered
|
14
|
-
Rakismet::Filter.filter(@controller, &lambda{})
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should not retain the request object in case of error" do
|
18
|
-
begin
|
19
|
-
Rakismet::Filter.filter(@controller, &lambda{ raise Rakismet::TestingError })
|
20
|
-
rescue Rakismet::TestingError
|
21
|
-
Rakismet::Base.current_request.should be_nil
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/spec/spec.opts
DELETED
data/uninstall.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
File.delete(File.join(RAILS_ROOT, %w(config initializers rakismet.rb)))
|