diaspora/spec/controllers/status_messages_controller_spec.rb
zhitomirskiyi abbf949fe1 publishing from a person profile page wip
mentioning a person from their profile page, added js & jasmine, still need to add the mention style, and prevent deselecting the last one

a tiny sass add

publishing from the profile works, need js translation

added the translation

made the hover state consistant

need to fix the cucumber spec

specs are green need to add a button

added the buttion to mention people

moved the publisher to the facebox

fixed the cucumbers for the modal window
2011-03-16 16:35:30 -07:00

174 lines
5.5 KiB
Ruby

# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
require 'spec_helper'
describe StatusMessagesController do
render_views
before do
@user1 = alice
@user2 = bob
@aspect1 = @user1.aspects.first
@aspect2 = @user2.aspects.first
request.env["HTTP_REFERER"] = ""
sign_in :user, @user1
@controller.stub!(:current_user).and_return(@user1)
@user1.reload
end
describe '#new' do
it 'succeeds' do
get :new,
:person_id => @user2.person.id
response.should be_success
end
end
describe '#show' do
before do
@message = @user1.build_post :status_message, :text => "ohai", :to => @aspect1.id
@message.save!
@user1.add_to_streams(@message, [@aspect1])
@user1.dispatch_post @message, :to => @aspect1.id
end
it 'succeeds' do
get :show, "id" => @message.id.to_s
response.should be_success
end
it 'marks a corresponding notification as read' do
alice.comment("comment after me", :on => @message)
bob.comment("here you go", :on => @message)
note = Notification.where(:recipient_id => alice.id, :target_id => @message.id).first
lambda{
get :show, :id => @message.id
note.reload
}.should change(note, :unread).from(true).to(false)
end
it 'redirects to back if there is no status message' do
get :show, :id => 2345
response.status.should == 302
end
end
describe '#create' do
let(:status_message_hash) {
{ :status_message => {
:public => "true",
:text => "facebook, is that you?",
},
:aspect_ids => [@aspect1.id.to_s] }
}
context 'js requests' do
it 'responds' do
post :create, status_message_hash.merge(:format => 'js')
response.status.should == 201
end
it 'responds with json' do
post :create, status_message_hash.merge(:format => 'js')
json = JSON.parse(response.body)
json['post_id'].should_not be_nil
json['html'].should_not be_nil
end
it 'escapes XSS' do
xss = "<script> alert('hi browser') </script>"
post :create, status_message_hash.merge(:format => 'js', :text => xss)
json = JSON.parse(response.body)
json['html'].should_not =~ /<script>/
end
end
it "dispatches the post to the specified services" do
s1 = Services::Facebook.new
@user1.services << s1
@user1.services << Services::Twitter.new
status_message_hash[:services] = ['facebook']
@user1.should_receive(:dispatch_post).with(anything(), hash_including(:services => [s1]))
post :create, status_message_hash
end
it "doesn't overwrite author_id" do
status_message_hash[:status_message][:author_id] = @user2.person.id
post :create, status_message_hash
new_message = StatusMessage.find_by_text(status_message_hash[:status_message][:text])
new_message.author_id.should == @user1.person.id
end
it "doesn't overwrite id" do
old_status_message = @user1.post(:status_message, :text => "hello", :to => @aspect1.id)
status_message_hash[:status_message][:id] = old_status_message.id
post :create, status_message_hash
old_status_message.reload.text.should == 'hello'
end
it 'calls dispatch post once subscribers is set' do
@user1.should_receive(:dispatch_post){|post, opts|
post.subscribers(@user1).should == [@user2.person]
}
post :create, status_message_hash
end
it 'sends the errors in the body on js' do
post :create, status_message_hash.merge!(:format => 'js', :status_message => {:text => ''})
response.body.should include('Status message requires a message or at least one photo')
end
context 'with photos' do
before do
fixture_filename = 'button.png'
fixture_name = File.join(File.dirname(__FILE__), '..', 'fixtures', fixture_filename)
@photo1 = @user1.build_post(:photo, :pending => true, :user_file=> File.open(fixture_name), :to => @aspect1.id)
@photo2 = @user1.build_post(:photo, :pending => true, :user_file=> File.open(fixture_name), :to => @aspect1.id)
@photo1.save!
@photo2.save!
@hash = status_message_hash
@hash[:photos] = [@photo1.id.to_s, @photo2.id.to_s]
end
it "will post a photo without text" do
@hash.delete :text
post :create, @hash
response.should be_redirect
end
it "dispatches all referenced photos" do
@user1.should_receive(:dispatch_post).exactly(3).times
post :create, @hash
end
it "sets the pending bit of referenced photos" do
post :create, @hash
@photo1.reload.pending.should be_false
@photo2.reload.pending.should be_false
end
end
end
describe '#destroy' do
let!(:message) {@user1.post(:status_message, :text => "hey", :to => @aspect1.id)}
let!(:message2) {@user2.post(:status_message, :text => "hey", :to => @aspect2.id)}
it 'let a user delete his photos' do
delete :destroy, :id => message.id
StatusMessage.find_by_id(message.id).should be_nil
end
it 'will not let you destroy posts visible to you' do
delete :destroy, :id => message2.id
StatusMessage.find_by_id(message2.id).should be_true
end
it 'will not let you destory posts you do not own' do
delete :destroy, :id => message2.id
StatusMessage.find_by_id(message2.id).should be_true
end
end
end