spambust 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -1
- data/LICENSE +1 -1
- data/README.md +18 -19
- data/lib/spambust/form_helpers.rb +2 -2
- data/lib/spambust/version.rb +1 -1
- metadata +11 -137
- data/spec/spambust/demo_app.rb +0 -41
- data/spec/spambust/form_helpers_integration_spec.rb +0 -74
- data/spec/spambust/form_helpers_spec.rb +0 -170
- data/spec/spambust/views/index.erb +0 -22
- data/spec/spambust/views/layout.erb +0 -9
- data/spec/spec_helper.rb +0 -30
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7a4a76c9da41d3cdf4a7954bc24a336802be30b7527fd03e651aa6b68d3f8d98
|
|
4
|
+
data.tar.gz: 66caf1c10bf2219b81c7faee5176479f683d8d672bd6e0643a7e5354f448d81d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 51d144acf81df166cc545507772bfc7dca2aa92a1fafe351087ae6b4c2fce5fa81e6ec4949518f6c4cde48aff93ba56b52d24f1de4bfb07c0f0bfd7eccca6c4f
|
|
7
|
+
data.tar.gz: 262e1871a85945d78660dc17ea3ad46cb73ac83f17e3e577d51d50de1b7637ff7e8dcc9459b1da9a0da26afd1bc49c0732e121c08dd73a72d33b8b90c6ba6a03
|
data/CHANGELOG.md
CHANGED
data/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
The MIT License (MIT)
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2013-
|
|
3
|
+
Copyright (c) 2013-2025 Chirantan Mitra
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
6
6
|
this software and associated documentation files (the "Software"), to deal in
|
data/README.md
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
[](https://github.com/chiku/spambust/actions/workflows/build.yml)
|
|
2
2
|
[](http://badge.fury.io/rb/spambust)
|
|
3
|
-
[](https://codeclimate.com/github/chiku/spambust)
|
|
4
3
|
|
|
5
4
|
spambust
|
|
6
5
|
========
|
|
@@ -8,22 +7,22 @@ spambust
|
|
|
8
7
|
Overview
|
|
9
8
|
--------
|
|
10
9
|
|
|
11
|
-
Prevent
|
|
10
|
+
Prevent spam bots from attacking your website.
|
|
12
11
|
|
|
13
12
|
Dependencies
|
|
14
13
|
------------
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
There are no runtime dependencies for this gem.
|
|
17
16
|
|
|
18
17
|
Installation
|
|
19
18
|
------------
|
|
20
19
|
|
|
21
|
-
```
|
|
20
|
+
```bash
|
|
22
21
|
gem install spambust
|
|
23
22
|
```
|
|
24
23
|
|
|
25
24
|
Usage
|
|
26
|
-
|
|
25
|
+
-----
|
|
27
26
|
|
|
28
27
|
**app.rb**
|
|
29
28
|
|
|
@@ -42,19 +41,19 @@ class TestApp < Sinatra::Base
|
|
|
42
41
|
end
|
|
43
42
|
|
|
44
43
|
get "/" do
|
|
45
|
-
erb :index, :
|
|
44
|
+
erb :index, locals: { result: "..." }
|
|
46
45
|
end
|
|
47
46
|
|
|
48
47
|
post '/' do
|
|
49
|
-
result = valid?("user", params) ? "
|
|
50
|
-
erb :index, :
|
|
48
|
+
result = valid?("user", params) ? "User is #{decrypt("user", params)}" : "Faking is bad"
|
|
49
|
+
erb :index, locals: { result: result }
|
|
51
50
|
end
|
|
52
51
|
|
|
53
52
|
start_app if direct_script_execution?
|
|
54
53
|
end
|
|
55
54
|
```
|
|
56
55
|
|
|
57
|
-
|
|
56
|
+
index.erb
|
|
58
57
|
|
|
59
58
|
```erb
|
|
60
59
|
<html>
|
|
@@ -66,23 +65,23 @@ end
|
|
|
66
65
|
|
|
67
66
|
<form method="post" action="/">
|
|
68
67
|
<label for="user-first-name">First name</label>
|
|
69
|
-
<%= input ["user", "first_name"], :
|
|
68
|
+
<%= input ["user", "first_name"], id: "user-first-name" %>
|
|
70
69
|
|
|
71
70
|
<label for="user-last-name">Last name</label>
|
|
72
|
-
<%= input ["user", "last_name"], :
|
|
71
|
+
<%= input ["user", "last_name"], id: "user-last-name" %>
|
|
73
72
|
|
|
74
73
|
<label for="user-email">Email</label>
|
|
75
|
-
<%= input ["user", "email"], :
|
|
74
|
+
<%= input ["user", "email"], size: 40, id: "user-email" %>
|
|
76
75
|
|
|
77
|
-
<%= submit "Create account", :
|
|
76
|
+
<%= submit "Create account", id: "user-submit" %>
|
|
78
77
|
</form>
|
|
79
78
|
</body>
|
|
80
79
|
</html>
|
|
81
80
|
```
|
|
82
81
|
|
|
83
|
-
|
|
82
|
+
output
|
|
84
83
|
|
|
85
|
-
```
|
|
84
|
+
```html
|
|
86
85
|
<input type="text" name="ee11cbb19052e40b07aac0ca060c23ee[2a034e9d9e2601c21191cca53760eaaf]" id="user-first-name" />
|
|
87
86
|
<input type="text" style="position:absolute;top:-10000px;left:-10000px;" name="user[first_name]" />
|
|
88
87
|
```
|
|
@@ -90,14 +89,14 @@ end
|
|
|
90
89
|
How does it work?
|
|
91
90
|
-----------------
|
|
92
91
|
|
|
93
|
-
The server
|
|
92
|
+
The server renders obfuscated input tags for users to fill. The input tags for the user are hidden. A spam bot will see input tags with meaningful names and fill them in. The server detects this and takes appropriate action.
|
|
94
93
|
|
|
95
94
|
Running tests
|
|
96
95
|
-------------
|
|
97
96
|
|
|
98
97
|
1. Clone the repository.
|
|
99
|
-
2.
|
|
100
|
-
3.
|
|
98
|
+
2. Run `bundle` from the root directory.
|
|
99
|
+
3. Run `rake` from the root directory.
|
|
101
100
|
|
|
102
101
|
Contributing
|
|
103
102
|
------------
|
|
@@ -91,7 +91,7 @@ module Spambust
|
|
|
91
91
|
# @return [String]
|
|
92
92
|
def input(paths, options = {})
|
|
93
93
|
type = options.delete(:type) || 'text'
|
|
94
|
-
sanitized_options = options.
|
|
94
|
+
sanitized_options = options.except(*BLOCKED_OPTIONS)
|
|
95
95
|
digested_paths = paths.map { |path| digest(path) }
|
|
96
96
|
visible_tag_options = options.merge(type: type, name: namify(digested_paths))
|
|
97
97
|
hidden_tag_options = sanitized_options.merge(type: 'text', name: namify(paths), style: HIDING)
|
|
@@ -130,7 +130,7 @@ module Spambust
|
|
|
130
130
|
# @return [String]
|
|
131
131
|
def namify(paths)
|
|
132
132
|
first = paths[0]
|
|
133
|
-
rest = paths[1
|
|
133
|
+
rest = paths[1..].reduce([]) { |a, e| a << "[#{e}]" }.join
|
|
134
134
|
"#{first}#{rest}"
|
|
135
135
|
end
|
|
136
136
|
|
data/lib/spambust/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,131 +1,18 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: spambust
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Chirantan Mitra
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
12
|
-
dependencies:
|
|
13
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: coveralls
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - ">="
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: '0'
|
|
20
|
-
type: :development
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - ">="
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: '0'
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: minitest
|
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - ">="
|
|
32
|
-
- !ruby/object:Gem::Version
|
|
33
|
-
version: '0'
|
|
34
|
-
type: :development
|
|
35
|
-
prerelease: false
|
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
-
requirements:
|
|
38
|
-
- - ">="
|
|
39
|
-
- !ruby/object:Gem::Version
|
|
40
|
-
version: '0'
|
|
41
|
-
- !ruby/object:Gem::Dependency
|
|
42
|
-
name: rack-test
|
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
|
44
|
-
requirements:
|
|
45
|
-
- - ">="
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: '0'
|
|
48
|
-
type: :development
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - ">="
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: '0'
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: rake
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - ">="
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '0'
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - ">="
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '0'
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: rubocop
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - ">="
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: '0'
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - ">="
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: '0'
|
|
83
|
-
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: simplecov
|
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - ">="
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: '0'
|
|
90
|
-
type: :development
|
|
91
|
-
prerelease: false
|
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
-
requirements:
|
|
94
|
-
- - ">="
|
|
95
|
-
- !ruby/object:Gem::Version
|
|
96
|
-
version: '0'
|
|
97
|
-
- !ruby/object:Gem::Dependency
|
|
98
|
-
name: sinatra
|
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
|
100
|
-
requirements:
|
|
101
|
-
- - ">="
|
|
102
|
-
- !ruby/object:Gem::Version
|
|
103
|
-
version: '0'
|
|
104
|
-
type: :development
|
|
105
|
-
prerelease: false
|
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
-
requirements:
|
|
108
|
-
- - ">="
|
|
109
|
-
- !ruby/object:Gem::Version
|
|
110
|
-
version: '0'
|
|
111
|
-
- !ruby/object:Gem::Dependency
|
|
112
|
-
name: yard
|
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
|
114
|
-
requirements:
|
|
115
|
-
- - ">="
|
|
116
|
-
- !ruby/object:Gem::Version
|
|
117
|
-
version: '0'
|
|
118
|
-
type: :development
|
|
119
|
-
prerelease: false
|
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
-
requirements:
|
|
122
|
-
- - ">="
|
|
123
|
-
- !ruby/object:Gem::Version
|
|
124
|
-
version: '0'
|
|
10
|
+
date: 2025-05-17 00:00:00.000000000 Z
|
|
11
|
+
dependencies: []
|
|
125
12
|
description: |
|
|
126
|
-
Render input tags with
|
|
127
|
-
|
|
128
|
-
|
|
13
|
+
Render input tags with masked names. The original input names are hidden.
|
|
14
|
+
A spam bot would fill the incorrect but visible input tags. The server
|
|
15
|
+
detects this and responds appropriately.
|
|
129
16
|
email:
|
|
130
17
|
- chirantan.mitra@gmail.com
|
|
131
18
|
executables: []
|
|
@@ -138,17 +25,11 @@ files:
|
|
|
138
25
|
- lib/spambust.rb
|
|
139
26
|
- lib/spambust/form_helpers.rb
|
|
140
27
|
- lib/spambust/version.rb
|
|
141
|
-
- spec/spambust/demo_app.rb
|
|
142
|
-
- spec/spambust/form_helpers_integration_spec.rb
|
|
143
|
-
- spec/spambust/form_helpers_spec.rb
|
|
144
|
-
- spec/spambust/views/index.erb
|
|
145
|
-
- spec/spambust/views/layout.erb
|
|
146
|
-
- spec/spec_helper.rb
|
|
147
28
|
homepage: https://github.com/chiku/spambust
|
|
148
29
|
licenses:
|
|
149
30
|
- MIT
|
|
150
|
-
metadata:
|
|
151
|
-
|
|
31
|
+
metadata:
|
|
32
|
+
rubygems_mfa_required: 'true'
|
|
152
33
|
rdoc_options: []
|
|
153
34
|
require_paths:
|
|
154
35
|
- lib
|
|
@@ -156,21 +37,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
156
37
|
requirements:
|
|
157
38
|
- - ">="
|
|
158
39
|
- !ruby/object:Gem::Version
|
|
159
|
-
version:
|
|
40
|
+
version: 3.2.0
|
|
160
41
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
42
|
requirements:
|
|
162
43
|
- - ">="
|
|
163
44
|
- !ruby/object:Gem::Version
|
|
164
45
|
version: '0'
|
|
165
46
|
requirements: []
|
|
166
|
-
rubygems_version: 3.
|
|
167
|
-
signing_key:
|
|
47
|
+
rubygems_version: 3.6.2
|
|
168
48
|
specification_version: 4
|
|
169
49
|
summary: Sinatra form helper to reduce spams
|
|
170
|
-
test_files:
|
|
171
|
-
- spec/spec_helper.rb
|
|
172
|
-
- spec/spambust/form_helpers_integration_spec.rb
|
|
173
|
-
- spec/spambust/demo_app.rb
|
|
174
|
-
- spec/spambust/form_helpers_spec.rb
|
|
175
|
-
- spec/spambust/views/layout.erb
|
|
176
|
-
- spec/spambust/views/index.erb
|
|
50
|
+
test_files: []
|
data/spec/spambust/demo_app.rb
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# frozen_string_literal: true
|
|
3
|
-
|
|
4
|
-
# demo_app.rb
|
|
5
|
-
#
|
|
6
|
-
# Author:: Chirantan Mitra
|
|
7
|
-
# Copyright:: Copyright (c) 2013-2020. All rights reserved
|
|
8
|
-
# License:: MIT
|
|
9
|
-
|
|
10
|
-
require 'tilt/erb'
|
|
11
|
-
require 'sinatra'
|
|
12
|
-
|
|
13
|
-
require_relative '../../lib/spambust/form_helpers'
|
|
14
|
-
|
|
15
|
-
module Spambust
|
|
16
|
-
class TestApp < Sinatra::Base
|
|
17
|
-
helpers Spambust::FormHelpers
|
|
18
|
-
|
|
19
|
-
class << self
|
|
20
|
-
def start_app
|
|
21
|
-
run!
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def direct_script_execution?
|
|
25
|
-
app_file == $PROGRAM_NAME
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
get '/' do
|
|
30
|
-
erb :index, locals: { result: '...' }
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
post '/' do
|
|
34
|
-
valid = valid?('user', params)
|
|
35
|
-
result = valid ? "User is #{decrypt('user', params)}" : 'Faking is bad'
|
|
36
|
-
erb :index, locals: { result: result }
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
start_app if direct_script_execution? && ENV['environment'] != 'test'
|
|
40
|
-
end
|
|
41
|
-
end
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# form_helpers_integration_spec.rb
|
|
4
|
-
#
|
|
5
|
-
# Author:: Chirantan Mitra
|
|
6
|
-
# Copyright:: Copyright (c) 2013-2020. All rights reserved
|
|
7
|
-
# License:: MIT
|
|
8
|
-
|
|
9
|
-
require_relative '../spec_helper'
|
|
10
|
-
require_relative 'demo_app'
|
|
11
|
-
|
|
12
|
-
describe 'Test application' do
|
|
13
|
-
include Rack::Test::Methods
|
|
14
|
-
|
|
15
|
-
let(:app) { Spambust::TestApp }
|
|
16
|
-
|
|
17
|
-
let(:user_digest) { Digest::MD5.hexdigest('user') }
|
|
18
|
-
let(:first_name_digest) { Digest::MD5.hexdigest('first_name') }
|
|
19
|
-
let(:last_name_digest) { Digest::MD5.hexdigest('last_name') }
|
|
20
|
-
let(:email_digest) { Digest::MD5.hexdigest('email') }
|
|
21
|
-
let(:hiding) { 'position:absolute;top:-10000px;left:-10000px;' }
|
|
22
|
-
|
|
23
|
-
describe 'when loading a form' do
|
|
24
|
-
it 'contains hidden input fields' do
|
|
25
|
-
get '/'
|
|
26
|
-
|
|
27
|
-
value(last_response.body).must_include %(<input size="40" type="text" \
|
|
28
|
-
name="user[email]" style="#{hiding}" />)
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
describe 'when posting a form' do
|
|
33
|
-
describe "when hidden fields aren't filled" do
|
|
34
|
-
it 'is accepted' do
|
|
35
|
-
params = {
|
|
36
|
-
user_digest => {
|
|
37
|
-
first_name_digest => 'True first name',
|
|
38
|
-
last_name_digest => 'True last name',
|
|
39
|
-
email_digest => 'True email'
|
|
40
|
-
},
|
|
41
|
-
'user' => {
|
|
42
|
-
'first_name' => '',
|
|
43
|
-
'last_name' => '',
|
|
44
|
-
'email' => ''
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
post '/', params
|
|
49
|
-
value(last_response.body).must_include %({"first_name"=>"True first name", \
|
|
50
|
-
"last_name"=>"True last name", "email"=>"True email"})
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
describe 'when hidden fields are filled' do
|
|
55
|
-
it 'is identified as fake' do
|
|
56
|
-
params = {
|
|
57
|
-
user_digest => {
|
|
58
|
-
first_name_digest => 'True first name',
|
|
59
|
-
last_name_digest => 'True last name',
|
|
60
|
-
email_digest => 'True email'
|
|
61
|
-
},
|
|
62
|
-
'user' => {
|
|
63
|
-
'first_name' => 'Fake first name',
|
|
64
|
-
'last_name' => 'Fake last name',
|
|
65
|
-
'email' => 'Fake email'
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
post '/', params
|
|
70
|
-
value(last_response.body).must_include 'Faking is bad'
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# form_helpers_spec.rb
|
|
4
|
-
#
|
|
5
|
-
# Author:: Chirantan Mitra
|
|
6
|
-
# Copyright:: Copyright (c) 2013-2020. All rights reserved
|
|
7
|
-
# License:: MIT
|
|
8
|
-
|
|
9
|
-
require 'digest/md5'
|
|
10
|
-
|
|
11
|
-
require_relative '../spec_helper'
|
|
12
|
-
require_relative '../../lib/spambust/form_helpers'
|
|
13
|
-
|
|
14
|
-
class TestApp
|
|
15
|
-
include Spambust::FormHelpers
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
describe 'Spambust::FormHelpers' do
|
|
19
|
-
subject { TestApp.new }
|
|
20
|
-
|
|
21
|
-
let(:user_digest) { Digest::MD5.hexdigest('user') }
|
|
22
|
-
let(:name_digest) { Digest::MD5.hexdigest('name') }
|
|
23
|
-
let(:hiding) { 'position:absolute;top:-10000px;left:-10000px;' }
|
|
24
|
-
|
|
25
|
-
describe '#input' do
|
|
26
|
-
describe 'when type is not mentioned' do
|
|
27
|
-
it "renders an input tag of type 'text'" do
|
|
28
|
-
value(subject.input(%w[user name])).must_equal %(\
|
|
29
|
-
<input type="text" name="#{user_digest}[#{name_digest}]" />\
|
|
30
|
-
<input type="text" name="user[name]" style="#{hiding}" />)
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
describe 'when type is mentioned' do
|
|
35
|
-
it 'renders an input tag of specified type' do
|
|
36
|
-
value(subject.input(%w[user name], type: 'password')).must_equal %(\
|
|
37
|
-
<input type="password" name="#{user_digest}[#{name_digest}]" />\
|
|
38
|
-
<input type="text" name="user[name]" style="#{hiding}" />)
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
describe 'when CSS options are mentioned' do
|
|
43
|
-
it 'renders the options' do
|
|
44
|
-
value(subject.input(%w[user name], maxlength: '40')).must_equal %(\
|
|
45
|
-
<input maxlength="40" type="text" name="#{user_digest}[#{name_digest}]" />\
|
|
46
|
-
<input maxlength="40" type="text" name="user[name]" style="#{hiding}" />)
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
describe "when CSS options include 'id'" do
|
|
51
|
-
it "doesn't repeat the 'id'" do
|
|
52
|
-
value(subject.input(%w[user name], id: 'name')).must_equal %(\
|
|
53
|
-
<input id="name" type="text" name="#{user_digest}[#{name_digest}]" />\
|
|
54
|
-
<input type="text" name="user[name]" style="#{hiding}" />)
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
describe "when CSS options include 'class'" do
|
|
59
|
-
it "doesn't repeat the 'class'" do
|
|
60
|
-
value(subject.input(%w[user name], class: 'name')).must_equal %(\
|
|
61
|
-
<input class="name" type="text" name="#{user_digest}[#{name_digest}]" />\
|
|
62
|
-
<input type="text" name="user[name]" style="#{hiding}" />)
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
describe "when CSS options include 'style'" do
|
|
67
|
-
it "uses the 'style' to hide the fake input tag" do
|
|
68
|
-
value(subject.input(%w[user name], style: 'padding-top: 2px;')).must_equal %(\
|
|
69
|
-
<input style="padding-top: 2px;" type="text" name="#{user_digest}[#{name_digest}]" />\
|
|
70
|
-
<input type="text" name="user[name]" style="#{hiding}" />)
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
describe '#submit' do
|
|
76
|
-
describe 'when type is mentioned' do
|
|
77
|
-
it "renders an input tag of specified 'submit" do
|
|
78
|
-
tag = %(<input type="submit" value="Submit" />)
|
|
79
|
-
value(subject.submit('Submit')).must_equal tag
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
describe 'when CSS options are mentioned' do
|
|
84
|
-
it 'renders the options' do
|
|
85
|
-
value(subject.submit('Submit', id: 'submit', class: 'submit')).must_equal %(\
|
|
86
|
-
<input id="submit" class="submit" type="submit" value="Submit" />)
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
describe '#namify' do
|
|
92
|
-
describe 'when size is one' do
|
|
93
|
-
it 'is the word itself' do
|
|
94
|
-
value(subject.namify(['user'])).must_equal 'user'
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
describe 'when size is more than one' do
|
|
99
|
-
it 'nests the items in successive square brackets' do
|
|
100
|
-
value(subject.namify(%w[user name first])).must_equal 'user[name][first]'
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
describe '#decrypt' do
|
|
106
|
-
it 'fetches the actual value of the lookup up key' do
|
|
107
|
-
params = {
|
|
108
|
-
'user' => { 'name' => 'spam value' },
|
|
109
|
-
user_digest => { name_digest => 'true value' }
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
value(subject.decrypt('user', params)).must_equal('name' => 'true value')
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
describe "when lookup doesn't exist" do
|
|
116
|
-
it 'is empty' do
|
|
117
|
-
params = {
|
|
118
|
-
'user' => { 'name' => 'spam value' },
|
|
119
|
-
user_digest => { name_digest => 'true value' }
|
|
120
|
-
}
|
|
121
|
-
value(subject.decrypt('missing_user', params)).must_equal({})
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
describe "when fake keys don't conform to the decrypted keys" do
|
|
126
|
-
it 'populates the key with a nil value' do
|
|
127
|
-
params = {
|
|
128
|
-
'user' => { 'name' => 'spam value' },
|
|
129
|
-
user_digest.succ => { name_digest => 'true value' }
|
|
130
|
-
}
|
|
131
|
-
value(subject.decrypt('user', params)).must_equal('name' => nil)
|
|
132
|
-
end
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
describe '#valid?' do
|
|
137
|
-
describe 'when none of the paths under lookup are populated' do
|
|
138
|
-
it 'is true' do
|
|
139
|
-
params = {
|
|
140
|
-
'user' => { 'name' => '' },
|
|
141
|
-
user_digest => { name_digest => 'true value' }
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
value(subject.valid?('user', params)).must_equal true
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
describe 'when one of the paths under lookup is populated' do
|
|
149
|
-
it 'is false' do
|
|
150
|
-
params = {
|
|
151
|
-
'user' => { 'name' => 'spam value' },
|
|
152
|
-
user_digest => { name_digest => 'true value' }
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
value(subject.valid?('user', params)).must_equal false
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
describe "when lookup doesn't exist" do
|
|
160
|
-
it 'is true' do
|
|
161
|
-
params = {
|
|
162
|
-
'user' => { 'name' => 'spam value' },
|
|
163
|
-
user_digest => { name_digest => 'true value' }
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
value(subject.valid?('user_missing', params)).must_equal true
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
end
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html>
|
|
3
|
-
<head>
|
|
4
|
-
<title>Sample Sinatra application</title>
|
|
5
|
-
</head>
|
|
6
|
-
<body>
|
|
7
|
-
<div id="result"><%= result %></div>
|
|
8
|
-
|
|
9
|
-
<form method="post" action="/">
|
|
10
|
-
<label for="user-first-name">First name</label>
|
|
11
|
-
<%= input ["user", "first_name"], :id => "user-first-name" %>
|
|
12
|
-
|
|
13
|
-
<label for="user-last-name">Last name</label>
|
|
14
|
-
<%= input ["user", "last_name"], :id => "user-last-name" %>
|
|
15
|
-
|
|
16
|
-
<label for="user-email">Email</label>
|
|
17
|
-
<%= input ["user", "email"], :size => 40, :id => "user-email" %>
|
|
18
|
-
|
|
19
|
-
<%= submit "Create account", :id => "user-submit" %>
|
|
20
|
-
</form>
|
|
21
|
-
</body>
|
|
22
|
-
</html>
|
data/spec/spec_helper.rb
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# spec_helper.rb
|
|
4
|
-
#
|
|
5
|
-
# Author:: Chirantan Mitra
|
|
6
|
-
# Copyright:: Copyright (c) 2013-2020. All rights reserved
|
|
7
|
-
# License:: MIT
|
|
8
|
-
|
|
9
|
-
ENV['environment'] = 'test'
|
|
10
|
-
|
|
11
|
-
begin
|
|
12
|
-
require 'simplecov'
|
|
13
|
-
require 'coveralls'
|
|
14
|
-
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new [
|
|
15
|
-
SimpleCov::Formatter::HTMLFormatter,
|
|
16
|
-
Coveralls::SimpleCov::Formatter
|
|
17
|
-
]
|
|
18
|
-
SimpleCov.start do
|
|
19
|
-
add_filter '/spec|test|vendor/'
|
|
20
|
-
end
|
|
21
|
-
rescue LoadError
|
|
22
|
-
puts "\nPlease install simplecov & coveralls to generate coverage report!\n\n"
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
gem 'minitest'
|
|
26
|
-
|
|
27
|
-
require 'minitest/autorun'
|
|
28
|
-
require 'minitest/spec'
|
|
29
|
-
require 'rack/test'
|
|
30
|
-
require 'sinatra/base'
|