diaspora/spec/models/pod_spec.rb
Florian Staudacher ea397ffdfb Add connection test for pods in the network
* add a class for checking pod connectivity
* extend pod model to handle new functionality
* add an admin frontend to list pods and re-trigger checks manually
* add a daily worker to run through all the pods
* add unit tests for most of the new code
2015-08-24 22:04:53 +02:00

78 lines
2.4 KiB
Ruby

require "spec_helper"
describe Pod, type: :model do
describe "::find_or_create_by" do
it "takes a url, and makes one by host" do
pod = Pod.find_or_create_by(url: "https://joindiaspora.com/maxwell")
expect(pod.host).to eq("joindiaspora.com")
end
it "sets ssl boolean (side-effect)" do
pod = Pod.find_or_create_by(url: "https://joindiaspora.com/maxwell")
expect(pod.ssl).to be true
end
end
describe "::check_all!" do
before do
@pods = (0..4).map do
double("pod").tap do |pod|
expect(pod).to receive(:test_connection!)
end
end
allow(Pod).to receive(:find_in_batches) { @pods }
end
it "calls #test_connection! on every pod" do
Pod.check_all!
end
end
describe "#test_connection!" do
before do
@pod = FactoryGirl.create(:pod)
@result = double("result")
allow(@result).to receive(:rt) { 123 }
allow(@result).to receive(:software_version) { "diaspora a.b.c.d" }
allow(@result).to receive(:failure_message) { "hello error!" }
expect(ConnectionTester).to receive(:check).at_least(:once).and_return(@result)
end
it "updates the connectivity values" do
allow(@result).to receive(:error)
allow(@result).to receive(:error?)
@pod.test_connection!
expect(@pod.status).to eq("no_errors")
expect(@pod.offline?).to be_falsy
expect(@pod.response_time).to eq(123)
expect(@pod.checked_at).to be_within(1.second).of Time.zone.now
end
it "handles a failed check" do
expect(@result).to receive(:error?).at_least(:once) { true }
expect(@result).to receive(:error).at_least(:once) { ConnectionTester::NetFailure.new }
@pod.test_connection!
expect(@pod.offline?).to be_truthy
expect(@pod.offline_since).to be_within(1.second).of Time.zone.now
end
it "preserves the original offline timestamp" do
expect(@result).to receive(:error?).at_least(:once) { true }
expect(@result).to receive(:error).at_least(:once) { ConnectionTester::NetFailure.new }
@pod.test_connection!
now = Time.zone.now
expect(@pod.offline_since).to be_within(1.second).of now
Timecop.travel(Time.zone.today + 30.days) do
@pod.test_connection!
expect(@pod.offline_since).to be_within(1.second).of now
expect(Time.zone.now).to be_within(1.day).of(now + 30.days)
end
end
end
end