Merge branch 'master' of github.com:diaspora/diaspora
This commit is contained in:
commit
cede80d47b
12 changed files with 978 additions and 870 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -17,6 +17,7 @@ public/uploads/*
|
||||||
public/source.tar*
|
public/source.tar*
|
||||||
tmp/**/*
|
tmp/**/*
|
||||||
db/*.sqlite3
|
db/*.sqlite3
|
||||||
|
.redcar
|
||||||
|
|
||||||
# Temporary files of every sort
|
# Temporary files of every sort
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
|
||||||
|
|
@ -37,8 +37,9 @@ class Person
|
||||||
before_destroy :remove_all_traces
|
before_destroy :remove_all_traces
|
||||||
before_validation :clean_url
|
before_validation :clean_url
|
||||||
validates_presence_of :url, :profile, :serialized_public_key
|
validates_presence_of :url, :profile, :serialized_public_key
|
||||||
validates_format_of :url, :with =>
|
validates_uniqueness_of :diaspora_handle, :case_sensitive => false
|
||||||
/^(https?):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(\.[a-z]{2,5})?(:[0-9]{1,5})?(\/.*)?$/ix
|
#validates_format_of :url, :with =>
|
||||||
|
# /^(https?):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(\.[a-z]{2,5})?(:[0-9]{1,5})?(\/.*)?$/ix
|
||||||
|
|
||||||
ensure_index :diaspora_handle
|
ensure_index :diaspora_handle
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,25 +3,57 @@
|
||||||
# the COPYRIGHT file.
|
# the COPYRIGHT file.
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
|
# Hostname of this host, as seen from the internet.
|
||||||
pod_url: "http://example.org/"
|
pod_url: "http://example.org/"
|
||||||
|
|
||||||
|
# Enable extensive logging to log/{development,test,production}.log
|
||||||
debug: false
|
debug: false
|
||||||
|
|
||||||
|
# Websocket server setup, see script/websocket_server.rb
|
||||||
|
# Enable extensive logging to websocket server.
|
||||||
socket_debug : false
|
socket_debug : false
|
||||||
|
|
||||||
|
# Websocket host, leave as 0.0.0.0 unless you know what you are doing
|
||||||
socket_host: 0.0.0.0
|
socket_host: 0.0.0.0
|
||||||
|
|
||||||
|
# File containing pid of running script/websocket_server.rb
|
||||||
socket_pidfile: "log/diaspora-wsd.pid"
|
socket_pidfile: "log/diaspora-wsd.pid"
|
||||||
|
|
||||||
|
# Websocket port, should normally be 8080 or 8081.
|
||||||
socket_port: 8080
|
socket_port: 8080
|
||||||
socket_collection_name: 'websocket'
|
socket_collection_name: 'websocket'
|
||||||
|
|
||||||
|
# Diaspora is only tested against this default pubsub server.
|
||||||
pubsub_server: 'https://pubsubhubbub.appspot.com/'
|
pubsub_server: 'https://pubsubhubbub.appspot.com/'
|
||||||
|
|
||||||
|
# Host/port for running mongodb server. See also mongodb.conf
|
||||||
mongo_host: 'localhost'
|
mongo_host: 'localhost'
|
||||||
mongo_port: 27017
|
mongo_port: 27017
|
||||||
|
|
||||||
|
# Setting this to true enables diaspora's "send email" functionality
|
||||||
|
# requiring meaningful smtp_* settings. These are options for RoR's
|
||||||
|
# ActionMailer class.
|
||||||
mailer_on: false
|
mailer_on: false
|
||||||
|
|
||||||
|
# Address/port to smtp server handing outgoing mail.
|
||||||
smtp_address: 'smtp.example.com'
|
smtp_address: 'smtp.example.com'
|
||||||
smtp_port: '587'
|
smtp_port: '587'
|
||||||
smtp_domain: 'mail.example.com'
|
|
||||||
smtp_authentication: 'plain'
|
|
||||||
smtp_sender_address: 'no-reply@example.com'
|
|
||||||
smtp_username: 'no-reply@example.com'
|
|
||||||
smtp_password: 'secret'
|
|
||||||
|
|
||||||
|
# Domain administered of smtp server.
|
||||||
|
smtp_domain: 'example.com'
|
||||||
|
|
||||||
|
# Sender address in diaspora's outgoing mail.
|
||||||
|
smtp_sender_address: 'no-reply@example.com'
|
||||||
|
|
||||||
|
# Authentication required to send mail. One of "plain",
|
||||||
|
# "login" or "cram-md5"
|
||||||
|
smtp_authentication: 'plain'
|
||||||
|
|
||||||
|
# Credentails possibly required to log in to SMTP server if
|
||||||
|
# smtp_authentication != 'plain'
|
||||||
|
smtp_username: 'smtp_username'
|
||||||
|
smtp_password: 'secret'
|
||||||
|
|
||||||
development:
|
development:
|
||||||
|
|
||||||
|
|
|
||||||
22
features/manages_contact_requests.feature
Normal file
22
features/manages_contact_requests.feature
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
Feature: managing contact requests
|
||||||
|
|
||||||
|
Background:
|
||||||
|
Given I am signed in
|
||||||
|
And I have one contact request
|
||||||
|
|
||||||
|
Scenario: seeing contact requests
|
||||||
|
When I am on the home page
|
||||||
|
Then I should see "Manage (1)" in the header
|
||||||
|
|
||||||
|
@javascript @wip
|
||||||
|
Scenario: accepting a contact request
|
||||||
|
Given I have an aspect called "Family"
|
||||||
|
|
||||||
|
When I am on the home page
|
||||||
|
And I follow "Manage (1)"
|
||||||
|
Then I should see 1 contact request
|
||||||
|
And I should see 0 contacts in "Family"
|
||||||
|
|
||||||
|
When I drag the contact request to the "Family" aspect
|
||||||
|
And I wait for the ajax to finish
|
||||||
|
Then I should see 1 contact in "Family"
|
||||||
|
|
@ -25,3 +25,8 @@ end
|
||||||
When /^I wait for the home page to load$/ do
|
When /^I wait for the home page to load$/ do
|
||||||
wait_until { current_path == root_path }
|
wait_until { current_path == root_path }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
When /^I wait for the ajax to finish$/ do
|
||||||
|
pending
|
||||||
|
# wait_until { ??? }
|
||||||
|
end
|
||||||
|
|
@ -6,3 +6,35 @@ end
|
||||||
When /^I click on my name$/ do
|
When /^I click on my name$/ do
|
||||||
click_link("#{@me.first_name} #{@me.last_name}")
|
click_link("#{@me.first_name} #{@me.last_name}")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Given /^I have an aspect called "([^"]*)"$/ do |aspect_name|
|
||||||
|
@me.aspects.create!(:name => aspect_name)
|
||||||
|
@me.reload
|
||||||
|
end
|
||||||
|
|
||||||
|
Given /^I have one contact request$/ do
|
||||||
|
other_user = make_user
|
||||||
|
other_user.aspects.create!(:name => "meh")
|
||||||
|
other_user.reload
|
||||||
|
|
||||||
|
other_user.send_contact_request_to(@me.person, other_user.aspects.first)
|
||||||
|
@me.reload
|
||||||
|
end
|
||||||
|
|
||||||
|
Then /^I should see (\d+) contact request(?:s)?$/ do |request_count|
|
||||||
|
number_of_requests = evaluate_script("$('.person.request.ui-draggable').length")
|
||||||
|
number_of_requests.should == request_count.to_i
|
||||||
|
end
|
||||||
|
|
||||||
|
Then /^I should see (\d+) contact(?:s)? in "([^"]*)"$/ do |contact_count, aspect_name|
|
||||||
|
aspect = @me.reload.aspects.find_by_name(aspect_name)
|
||||||
|
number_of_contacts = evaluate_script("$('li.person.ui-draggable[data-aspect_id=\"#{aspect.id}\"]').length")
|
||||||
|
number_of_contacts.should == contact_count.to_i
|
||||||
|
end
|
||||||
|
|
||||||
|
When /^I drag the contact request to the "([^"]*)" aspect$/ do |aspect_name|
|
||||||
|
aspect = @me.reload.aspects.find_by_name(aspect_name)
|
||||||
|
aspect_div = find("ul.dropzone[data-aspect_id='#{aspect.id}']")
|
||||||
|
request_li = find(".person.request.ui-draggable")
|
||||||
|
request_li.drag_to(aspect_div)
|
||||||
|
end
|
||||||
|
|
|
||||||
|
|
@ -41,3 +41,11 @@ begin
|
||||||
DatabaseCleaner.strategy = :truncation
|
DatabaseCleaner.strategy = :truncation
|
||||||
DatabaseCleaner.orm = "mongo_mapper"
|
DatabaseCleaner.orm = "mongo_mapper"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
require File.join(File.dirname(__FILE__), "..", "..", "spec", "helper_methods")
|
||||||
|
include HelperMethods
|
||||||
|
|
||||||
|
Before do
|
||||||
|
UserFixer.regenerate_user_fixtures
|
||||||
|
UserFixer.load_user_fixtures
|
||||||
|
end
|
||||||
|
|
@ -50,7 +50,7 @@ var AspectEdit = {
|
||||||
type: "DELETE",
|
type: "DELETE",
|
||||||
url: "/requests/" + person.attr('data-guid'),
|
url: "/requests/" + person.attr('data-guid'),
|
||||||
data: {"accept" : true, "aspect_id" : dropzone.attr('data-aspect_id') },
|
data: {"accept" : true, "aspect_id" : dropzone.attr('data-aspect_id') },
|
||||||
success: function() { AspectEdit.onDeleteRequestSuccess(person); }
|
success: function() { AspectEdit.onDeleteRequestSuccess(person, dropzone); }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -70,9 +70,11 @@ var AspectEdit = {
|
||||||
dropzone.closest("ul").append(person);
|
dropzone.closest("ul").append(person);
|
||||||
},
|
},
|
||||||
|
|
||||||
onDeleteRequestSuccess: function(person) {
|
onDeleteRequestSuccess: function(person, dropzone) {
|
||||||
AspectEdit.decrementRequestsCounter();
|
AspectEdit.decrementRequestsCounter();
|
||||||
person.removeClass('request');
|
person.removeClass('request');
|
||||||
|
person.attr('data-aspect_id', dropzone.attr('data-aspect_id'));
|
||||||
|
person.removeAttr('data-person_id');
|
||||||
},
|
},
|
||||||
|
|
||||||
onMovePersonSuccess: function(person, dropzone) {
|
onMovePersonSuccess: function(person, dropzone) {
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,34 @@ describe RequestsController do
|
||||||
@user = make_user
|
@user = make_user
|
||||||
|
|
||||||
sign_in :user, @user
|
sign_in :user, @user
|
||||||
@user.aspects.create(:name => "lame-os")
|
|
||||||
|
@user.aspects.create!(:name => "lame-os")
|
||||||
|
@user.reload
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#destroy' do
|
||||||
|
before do
|
||||||
|
@other_user = make_user
|
||||||
|
@other_user.aspects.create!(:name => "meh")
|
||||||
|
@other_user.reload
|
||||||
|
|
||||||
|
@other_user.send_contact_request_to(@user.person, @other_user.aspects.first)
|
||||||
|
|
||||||
|
@user.reload # so it can find its pending requests.
|
||||||
|
@friend_request = @user.pending_requests.first
|
||||||
|
end
|
||||||
|
describe 'when accepting a contact request' do
|
||||||
|
it "succeeds" do
|
||||||
|
xhr :delete, :destroy, "accept" => "true", "aspect_id" => @user.aspects.first.id.to_s, "id" => @friend_request.id.to_s
|
||||||
|
response.should redirect_to(aspect_path(@user.aspects.first))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
describe 'when ignoring a contact request' do
|
||||||
|
it "succeeds" do
|
||||||
|
xhr :delete, :destroy, "id" => @friend_request.id.to_s
|
||||||
|
response.should redirect_to(requests_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#create' do
|
describe '#create' do
|
||||||
|
|
|
||||||
1654
spec/fixtures/users.yaml
vendored
1654
spec/fixtures/users.yaml
vendored
File diff suppressed because it is too large
Load diff
|
|
@ -183,14 +183,32 @@ describe("AspectEdit", function() {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it("decrements the request counter", function() {
|
it("decrements the request counter", function() {
|
||||||
|
var person = $('li.person');
|
||||||
|
var dropzone = $('.dropzone.ui-droppable[data-aspect_id="guid-of-target-aspect"]');
|
||||||
spyOn(AspectEdit, "decrementRequestsCounter");
|
spyOn(AspectEdit, "decrementRequestsCounter");
|
||||||
AspectEdit.onDeleteRequestSuccess($('li.person'));
|
AspectEdit.onDeleteRequestSuccess(person, dropzone);
|
||||||
expect(AspectEdit.decrementRequestsCounter).toHaveBeenCalled();
|
expect(AspectEdit.decrementRequestsCounter).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
it("takes the request class off the person li", function() {
|
it("takes the request class off the person li", function() {
|
||||||
expect($('li.person')).toHaveClass('request');
|
var person = $('li.person');
|
||||||
AspectEdit.onDeleteRequestSuccess($('li.person'));
|
var dropzone = $('.dropzone.ui-droppable[data-aspect_id="guid-of-target-aspect"]');
|
||||||
expect($('li.person')).not.toHaveClass('request');
|
expect(person).toHaveClass('request');
|
||||||
|
AspectEdit.onDeleteRequestSuccess(person, dropzone);
|
||||||
|
expect(person).not.toHaveClass('request');
|
||||||
|
});
|
||||||
|
it("removes data-person_id from the li", function() {
|
||||||
|
var person = $('li.person');
|
||||||
|
var dropzone = $('.dropzone.ui-droppable[data-aspect_id="guid-of-target-aspect"]');
|
||||||
|
expect(person.attr("data-person_id")).toBeDefined();
|
||||||
|
AspectEdit.onDeleteRequestSuccess(person, dropzone);
|
||||||
|
expect(person.attr("data-person_id")).not.toBeDefined();
|
||||||
|
});
|
||||||
|
it("puts a data-aspect_id on the li", function() {
|
||||||
|
var person = $('li.person');
|
||||||
|
var dropzone = $('.dropzone.ui-droppable[data-aspect_id="guid-of-target-aspect"]');
|
||||||
|
expect(person.attr("data-aspect_id")).not.toBeDefined();
|
||||||
|
AspectEdit.onDeleteRequestSuccess(person, dropzone);
|
||||||
|
expect(person.attr("data-aspect_id")).toEqual("guid-of-target-aspect");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ describe Person do
|
||||||
describe "vaild url" do
|
describe "vaild url" do
|
||||||
it 'should allow for https urls' do
|
it 'should allow for https urls' do
|
||||||
person = Factory.create(:person, :url => "https://example.com")
|
person = Factory.create(:person, :url => "https://example.com")
|
||||||
person.valid?.should == true
|
person.should be_valid
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -51,12 +51,12 @@ describe Person do
|
||||||
describe 'validation' do
|
describe 'validation' do
|
||||||
it 'is unique' do
|
it 'is unique' do
|
||||||
person_two = Factory.build(:person, :diaspora_handle => @person.diaspora_handle)
|
person_two = Factory.build(:person, :diaspora_handle => @person.diaspora_handle)
|
||||||
person_two.valid?.should be_false
|
person_two.should_not be_valid
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'is case insensitive' do
|
it 'is case insensitive' do
|
||||||
person_two = Factory.build(:person, :url => @person.url.upcase)
|
person_two = Factory.build(:person, :diaspora_handle => @person.diaspora_handle.upcase)
|
||||||
person_two.valid?.should be_false
|
person_two.should_not be_valid
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue