saucy 0.2.25 → 0.2.26

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.
@@ -7,13 +7,17 @@ Feature: Manage Projects
7
7
  Given the following account exists:
8
8
  | name | keyword |
9
9
  | Test | test |
10
- And I have signed in with "joe@example.com/test"
10
+ And the following user exists:
11
+ | name | email |
12
+ | Joe User | joe@example.com |
11
13
  And "joe@example.com" is an admin of the "Test" account
14
+ And I sign in as "joe@example.com"
12
15
 
13
16
  Scenario: Create new project
14
17
  When I go to the projects page for the "Test" account
15
18
  And I follow "New Project"
16
- And I fill in "Name" with "Project 1"
19
+ Then the "Joe User" checkbox should be checked
20
+ When I fill in "Name" with "Project 1"
17
21
  And I fill in "Keyword" with "project1"
18
22
  And I should see "http://www.example.com/accounts/test/projects/keyword"
19
23
  And I press "Create"
data/lib/saucy/project.rb CHANGED
@@ -15,14 +15,26 @@ module Saucy
15
15
  :with => %r{^[a-z0-9]+$},
16
16
  :message => "must be only lower case letters."
17
17
 
18
- after_create :assign_default_memberships
19
18
  after_save :update_memberships
20
19
 
21
- # We have to define this here instead of mixing it in,
22
- # because ActiveRecord does the same
20
+ # We have to define these here instead of mixing them in,
21
+ # because ActiveRecord does the same.
22
+
23
23
  def user_ids=(new_user_ids)
24
24
  @new_user_ids = new_user_ids.reject { |user_id| user_id.blank? }
25
25
  end
26
+
27
+ def users
28
+ if new_record?
29
+ permissions.map { |permission| permission.membership.user }
30
+ else
31
+ permissions.includes(:user).map { |permission| permission.user }
32
+ end
33
+ end
34
+
35
+ def user_ids
36
+ users.map(&:id)
37
+ end
26
38
  end
27
39
 
28
40
  module ClassMethods
@@ -33,6 +45,10 @@ module Saucy
33
45
  def by_name
34
46
  order("projects.name")
35
47
  end
48
+
49
+ def build_with_default_permissions
50
+ new.assign_default_permissions
51
+ end
36
52
  end
37
53
 
38
54
  module InstanceMethods
@@ -46,14 +62,15 @@ module Saucy
46
62
  exists?(:memberships => { :user_id => user.id })
47
63
  end
48
64
 
49
- private
50
-
51
- def assign_default_memberships
65
+ def assign_default_permissions
52
66
  account.memberships.where(:admin => true).each do |membership|
53
- self.permissions.create(:membership => membership)
67
+ self.permissions.build(:membership => membership)
54
68
  end
69
+ self
55
70
  end
56
71
 
72
+ private
73
+
57
74
  def update_memberships
58
75
  if @new_user_ids
59
76
  removed_user_ids = self.user_ids - @new_user_ids
@@ -10,7 +10,7 @@ module Saucy
10
10
 
11
11
  module InstanceMethods
12
12
  def new
13
- @project = current_account.projects.build
13
+ @project = current_account.projects.build_with_default_permissions
14
14
  end
15
15
 
16
16
  def create
@@ -4,7 +4,6 @@ describe Project do
4
4
  it { should belong_to(:account) }
5
5
  it { should validate_presence_of(:account_id) }
6
6
  it { should have_many(:permissions) }
7
- it { should have_many(:users).through(:permissions) }
8
7
  it { should validate_presence_of(:keyword) }
9
8
  it { should validate_presence_of(:name) }
10
9
 
@@ -50,13 +49,26 @@ describe Project, "keyword uniqueness" do
50
49
  end
51
50
  end
52
51
 
52
+ share_examples_for "default project permissions" do
53
+ it "is viewable by admins by default" do
54
+ admins.each do |admin|
55
+ subject.users.should include(admin)
56
+ end
57
+ end
58
+
59
+ it "isn't viewable by non-members" do
60
+ subject.users.should_not include(non_admin)
61
+ subject.users.should_not include(non_member)
62
+ end
63
+ end
64
+
53
65
  describe Project, "for an account with admin and non-admin users" do
54
66
  let!(:account) { Factory(:account, :name => "Account") }
55
67
  let!(:other_account) { Factory(:account, :name => "Other") }
56
68
  let!(:non_admin) { Factory(:user) }
57
69
  let!(:admins) { [Factory(:user), Factory(:user)] }
58
70
  let!(:non_member) { Factory(:user) }
59
- subject { Factory(:project, :account => account) }
71
+ subject { Factory.build(:project, :account => account) }
60
72
 
61
73
  before do
62
74
  Factory(:membership, :account => account, :user => non_admin, :admin => false)
@@ -66,21 +78,21 @@ describe Project, "for an account with admin and non-admin users" do
66
78
  admins.each do |admin|
67
79
  Factory(:membership, :user => admin, :account => account, :admin => true)
68
80
  end
81
+
82
+ subject.assign_default_permissions
69
83
  end
70
84
 
71
- it "has users" do
72
- subject.users.should_not be_empty
85
+ context "before saving" do
86
+ it_behaves_like "default project permissions"
73
87
  end
74
88
 
75
- it "is viewable by admins by default" do
76
- admins.each do |admin|
77
- should have_member(admin)
89
+ context "after saving" do
90
+ before do
91
+ subject.save!
92
+ subject.reload
78
93
  end
79
- end
80
94
 
81
- it "isn't viewable by non-members" do
82
- should_not have_member(non_admin)
83
- should_not have_member(non_member)
95
+ it_behaves_like "default project permissions"
84
96
  end
85
97
  end
86
98
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saucy
3
3
  version: !ruby/object:Gem::Version
4
- hash: 37
4
+ hash: 35
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 25
10
- version: 0.2.25
9
+ - 26
10
+ version: 0.2.26
11
11
  platform: ruby
12
12
  authors:
13
13
  - thoughtbot, inc.