@@ -21,11 +21,15 @@ module Agents |
||
| 21 | 21 |
* `this.options(key)` |
| 22 | 22 |
* `this.log(message)` |
| 23 | 23 |
* `this.error(message)` |
| 24 |
- |
|
| 25 | 24 |
MD |
| 26 | 25 |
|
| 27 | 26 |
def validate_options |
| 28 |
- errors.add(:base, "The 'code' option is required") unless options['code'].present? |
|
| 27 |
+ cred_name = credential_referenced_by_code |
|
| 28 |
+ if cred_name |
|
| 29 |
+ errors.add(:base, "The credential '#{cred_name}' referenced by code cannot be found") unless credential(cred_name).present?
|
|
| 30 |
+ else |
|
| 31 |
+ errors.add(:base, "The 'code' option is required") unless options['code'].present? |
|
| 32 |
+ end |
|
| 29 | 33 |
end |
| 30 | 34 |
|
| 31 | 35 |
def working? |
@@ -99,10 +103,23 @@ module Agents |
||
| 99 | 103 |
end |
| 100 | 104 |
end |
| 101 | 105 |
|
| 102 |
- context.eval(options['code']) |
|
| 106 |
+ context.eval(code) |
|
| 103 | 107 |
context.eval("Agent.#{js_function}();")
|
| 104 | 108 |
end |
| 105 | 109 |
|
| 110 |
+ def code |
|
| 111 |
+ cred = credential_referenced_by_code |
|
| 112 |
+ if cred |
|
| 113 |
+ credential(cred) || 'Agent.check = function() { this.error("Unable to find credential"); };'
|
|
| 114 |
+ else |
|
| 115 |
+ options['code'] |
|
| 116 |
+ end |
|
| 117 |
+ end |
|
| 118 |
+ |
|
| 119 |
+ def credential_referenced_by_code |
|
| 120 |
+ options['code'] =~ /\Acredential:(.*)\Z/ && $1 |
|
| 121 |
+ end |
|
| 122 |
+ |
|
| 106 | 123 |
def setup_javascript |
| 107 | 124 |
<<-JS |
| 108 | 125 |
function Agent() {};
|
@@ -22,6 +22,14 @@ describe Agents::JavaScriptAgent do |
||
| 22 | 22 |
@agent.options.delete('code')
|
| 23 | 23 |
@agent.should_not be_valid |
| 24 | 24 |
end |
| 25 |
+ |
|
| 26 |
+ it "accepts a credential, but it must exist" do |
|
| 27 |
+ @agent.should be_valid |
|
| 28 |
+ @agent.options['code'] = 'credential:foo' |
|
| 29 |
+ @agent.should_not be_valid |
|
| 30 |
+ users(:jane).user_credentials.create! :credential_name => "foo", :credential_value => "bar" |
|
| 31 |
+ @agent.reload.should be_valid |
|
| 32 |
+ end |
|
| 25 | 33 |
end |
| 26 | 34 |
|
| 27 | 35 |
describe "#working?" do |
@@ -55,7 +63,7 @@ describe Agents::JavaScriptAgent do |
||
| 55 | 63 |
describe "executing code" do |
| 56 | 64 |
it "works by default" do |
| 57 | 65 |
@agent.options = @agent.default_options |
| 58 |
- @agent.options['make_event'] = true; |
|
| 66 |
+ @agent.options['make_event'] = true |
|
| 59 | 67 |
@agent.save! |
| 60 | 68 |
|
| 61 | 69 |
lambda {
|
@@ -66,6 +74,26 @@ describe Agents::JavaScriptAgent do |
||
| 66 | 74 |
}.should change { Event.count }.by(2)
|
| 67 | 75 |
end |
| 68 | 76 |
|
| 77 |
+ |
|
| 78 |
+ describe "using credentials as code" do |
|
| 79 |
+ before do |
|
| 80 |
+ @agent.user.user_credentials.create :credential_name => 'code-foo', :credential_value => 'Agent.check = function() { this.log("ran it"); };'
|
|
| 81 |
+ @agent.options['code'] = 'credential:code-foo' |
|
| 82 |
+ @agent.save! |
|
| 83 |
+ end |
|
| 84 |
+ |
|
| 85 |
+ it "accepts credentials" do |
|
| 86 |
+ @agent.check |
|
| 87 |
+ AgentLog.last.message.should == "ran it" |
|
| 88 |
+ end |
|
| 89 |
+ |
|
| 90 |
+ it "logs an error when the credential goes away" do |
|
| 91 |
+ @agent.user.user_credentials.delete_all |
|
| 92 |
+ @agent.reload.check |
|
| 93 |
+ AgentLog.last.message.should == "Unable to find credential" |
|
| 94 |
+ end |
|
| 95 |
+ end |
|
| 96 |
+ |
|
| 69 | 97 |
describe "error handling" do |
| 70 | 98 |
it "should log an error when V8 has issues" do |
| 71 | 99 |
@agent.options['code'] = 'syntax error!' |