archangel 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.jshintrc +3 -3
  3. data/.reek +9 -0
  4. data/Gemfile +1 -0
  5. data/app/assets/javascripts/archangel/object/flash.js +2 -2
  6. data/app/assets/javascripts/archangel/object/routes.js.erb +4 -0
  7. data/app/assets/javascripts/archangel/object/routes/backend.js +13 -2
  8. data/app/helpers/archangel/flash_helper.rb +1 -1
  9. data/app/models/archangel/asset.rb +1 -1
  10. data/app/models/archangel/collection.rb +3 -3
  11. data/app/models/archangel/page.rb +1 -1
  12. data/app/models/archangel/site.rb +3 -4
  13. data/app/models/archangel/user.rb +4 -2
  14. data/app/models/archangel/widget.rb +1 -1
  15. data/app/services/archangel/render_service.rb +1 -7
  16. data/app/services/archangel/template_render_service.rb +1 -3
  17. data/app/themes/default/assets/javascripts/default/backend.js +0 -2
  18. data/app/themes/default/assets/javascripts/default/backend/core.js +71 -2
  19. data/app/themes/default/assets/javascripts/default/common/flash.js +1 -1
  20. data/app/themes/default/views/layouts/auth.html.erb +2 -0
  21. data/app/themes/default/views/layouts/backend/_sidebar.html.erb +7 -5
  22. data/app/views/archangel/shared/_flash_messages.html.erb +3 -3
  23. data/app/views/devise/shared/_links.html.erb +7 -7
  24. data/db/migrate/20171003210347_create_archangel_users.rb +2 -2
  25. data/db/migrate/20171005224054_create_archangel_pages.rb +1 -1
  26. data/db/migrate/20171006175939_create_archangel_widgets.rb +1 -1
  27. data/db/migrate/20171006194044_create_archangel_collections.rb +1 -1
  28. data/db/seeds.rb +72 -7
  29. data/docs/Extension/Models.md +1 -1
  30. data/lib/archangel/command/templates/extension/config/routes.rb +1 -1
  31. data/lib/archangel/engine.rb +4 -0
  32. data/lib/archangel/version.rb +1 -1
  33. data/lib/generators/archangel/dummy/templates/config/database.yml +0 -12
  34. data/spec/lib/archangel/command/extension_spec.rb +1 -1
  35. data/spec/models/archangel/asset_spec.rb +11 -14
  36. data/spec/models/archangel/collection_spec.rb +37 -7
  37. data/spec/models/archangel/entry_spec.rb +8 -6
  38. data/spec/models/archangel/field_spec.rb +21 -10
  39. data/spec/models/archangel/page_spec.rb +65 -24
  40. data/spec/models/archangel/site_spec.rb +45 -2
  41. data/spec/models/archangel/template_spec.rb +16 -9
  42. data/spec/models/archangel/user_spec.rb +44 -15
  43. data/spec/models/archangel/widget_spec.rb +44 -10
  44. data/spec/policies/archangel/asset_policy_spec.rb +26 -9
  45. data/spec/policies/archangel/collection_policy_spec.rb +23 -8
  46. data/spec/policies/archangel/entries_policy_spec.rb +26 -9
  47. data/spec/policies/archangel/page_policy_spec.rb +23 -8
  48. data/spec/policies/archangel/site_policy_spec.rb +11 -9
  49. data/spec/policies/archangel/template_policy_spec.rb +23 -8
  50. data/spec/policies/archangel/user_policy_spec.rb +23 -8
  51. data/spec/policies/archangel/widget_policy_spec.rb +23 -8
  52. metadata +2 -4
  53. data/app/themes/default/assets/javascripts/default/common/navigation.js +0 -30
  54. data/app/themes/default/assets/javascripts/default/common/sidebar.js +0 -114
@@ -4,8 +4,51 @@ require "rails_helper"
4
4
 
5
5
  module Archangel
6
6
  RSpec.describe Site, type: :model do
7
- describe "ActiveModel validations" do
8
- it { expect(subject).to validate_presence_of(:name) }
7
+ context "validations" do
8
+ it { is_expected.to validate_presence_of(:locale) }
9
+ it { is_expected.to validate_presence_of(:name) }
10
+
11
+ it { is_expected.to allow_value("").for(:theme) }
12
+
13
+ it "allows certain languages" do
14
+ expect(subject)
15
+ .to validate_inclusion_of(:locale).in_array(Archangel::LANGUAGES)
16
+ end
17
+
18
+ it "allows certain languages" do
19
+ expect(subject)
20
+ .to validate_inclusion_of(:theme).in_array(Archangel.themes)
21
+ end
22
+ end
23
+
24
+ it { is_expected.to have_many(:assets) }
25
+ it { is_expected.to have_many(:collections) }
26
+ it { is_expected.to have_many(:pages) }
27
+ it { is_expected.to have_many(:templates) }
28
+ it { is_expected.to have_many(:users) }
29
+ it { is_expected.to have_many(:widgets) }
30
+ it { is_expected.to have_many(:entries).through(:collections) }
31
+ it { is_expected.to have_many(:fields).through(:collections) }
32
+
33
+ context ".current" do
34
+ it "returns an existing object" do
35
+ resource = create(:site, name: "My Awesome New Site")
36
+
37
+ expect(described_class.current).to eq(resource)
38
+ expect(described_class.current.name).to eq("My Awesome New Site")
39
+ end
40
+
41
+ it "returns a new object" do
42
+ expect(described_class.current.name).to eq("Archangel")
43
+ end
44
+ end
45
+
46
+ context "#to_liquid" do
47
+ it "returns a Liquid object" do
48
+ resource = build(:site)
49
+
50
+ expect(resource.to_liquid).to be_a(Archangel::Liquid::Drops::SiteDrop)
51
+ end
9
52
  end
10
53
  end
11
54
  end
@@ -5,20 +5,27 @@ require "rails_helper"
5
5
  module Archangel
6
6
  RSpec.describe Template, type: :model do
7
7
  context "validations" do
8
- it { expect(subject).to validate_presence_of(:content) }
9
- it { expect(subject).to validate_presence_of(:name) }
8
+ it { is_expected.to validate_presence_of(:content) }
9
+ it { is_expected.to validate_presence_of(:name) }
10
10
 
11
- it { expect(subject).to allow_value(true).for(:partial) }
12
- it { expect(subject).to allow_value(false).for(:partial) }
13
- it { expect(subject).not_to allow_value(nil).for(:partial) }
11
+ it { is_expected.to allow_value(true).for(:partial) }
12
+ it { is_expected.to allow_value(false).for(:partial) }
14
13
 
15
- it { expect(subject).to allow_value("{{ foo }}").for(:content) }
16
- it { expect(subject).not_to allow_value("{{ foo }").for(:content) }
14
+ it { is_expected.to_not allow_value(nil).for(:partial) }
15
+
16
+ it { is_expected.to allow_value("{{ foo }}").for(:content) }
17
+ it { is_expected.to_not allow_value("{{ foo }").for(:content) }
17
18
  end
18
19
 
19
20
  context "associations" do
20
- it { expect(subject).to belong_to(:parent) }
21
- it { expect(subject).to belong_to(:site) }
21
+ it { is_expected.to belong_to(:site) }
22
+
23
+ it "belongs to Template" do
24
+ expect(subject).to(
25
+ belong_to(:parent).conditions(partial: false)
26
+ .class_name("Archangel::Template")
27
+ )
28
+ end
22
29
  end
23
30
  end
24
31
  end
@@ -7,27 +7,33 @@ module Archangel
7
7
  context "callbacks" do
8
8
  let(:resource) { create(:user) }
9
9
 
10
- it do
11
- expect(resource).to callback(:parameterize_username).before(:validation)
12
- end
10
+ it { is_expected.to callback(:parameterize_username).before(:validation) }
11
+
12
+ it { is_expected.to callback(:column_default).after(:initialize) }
13
13
 
14
- it { expect(resource).to callback(:column_default).after(:initialize) }
15
- it { expect(resource).to callback(:column_reset).after(:destroy) }
14
+ it { is_expected.to callback(:column_reset).after(:destroy) }
16
15
  end
17
16
 
18
17
  context "validations" do
19
- it { expect(subject).to validate_presence_of(:email) }
20
- it { expect(subject).to validate_presence_of(:name) }
21
- it { expect(subject).to validate_presence_of(:password).on(:create) }
22
- it { expect(subject).to validate_presence_of(:role) }
23
- it { expect(subject).to validate_presence_of(:username) }
18
+ it { is_expected.to validate_presence_of(:email) }
19
+ it { is_expected.to validate_presence_of(:name) }
20
+ it { is_expected.to validate_presence_of(:password).on(:create) }
21
+ it { is_expected.to validate_presence_of(:role) }
22
+ it { is_expected.to validate_presence_of(:username) }
23
+
24
+ it { is_expected.to validate_length_of(:password).is_at_least(8) }
25
+
26
+ it { is_expected.to validate_presence_of(:password).on(:update) }
24
27
 
25
- it { expect(subject).to validate_length_of(:password).is_at_least(8) }
28
+ it "has a unique username scoped to Site" do
29
+ resource = build(:user)
26
30
 
27
- it { expect(subject).to have_db_index(:email).unique(true) }
28
- it { expect(subject).to have_db_index(:username).unique(true) }
31
+ expect(resource).to(
32
+ validate_uniqueness_of(:username).scoped_to(:site_id).case_insensitive
33
+ )
34
+ end
29
35
 
30
- it do
36
+ it "allows certain roles" do
31
37
  expect(subject)
32
38
  .to validate_inclusion_of(:role).in_array(Archangel::ROLES)
33
39
  end
@@ -60,7 +66,30 @@ module Archangel
60
66
  end
61
67
 
62
68
  context "associations" do
63
- it { expect(subject).to belong_to(:site) }
69
+ it { is_expected.to belong_to(:site) }
70
+ end
71
+
72
+ context "#to_param" do
73
+ it "uses `slug` as the identifier for routes" do
74
+ resource = build(:user, username: "foo")
75
+
76
+ expect(resource.to_param).to eq("foo")
77
+ end
78
+ end
79
+
80
+ context "#column_reset" do
81
+ before { ::Timecop.freeze }
82
+ after { ::Timecop.return }
83
+
84
+ it "resets `slug` to `slug` + current time" do
85
+ resource = create(:user)
86
+
87
+ username = resource.username
88
+
89
+ resource.destroy!
90
+
91
+ expect(resource.username).to eq "#{Time.current.to_i}_#{username}"
92
+ end
64
93
  end
65
94
  end
66
95
  end
@@ -5,25 +5,59 @@ require "rails_helper"
5
5
  module Archangel
6
6
  RSpec.describe Widget, type: :model do
7
7
  context "callbacks" do
8
- it { expect(subject).to callback(:parameterize_slug).before(:validation) }
8
+ it { is_expected.to callback(:parameterize_slug).before(:validation) }
9
9
 
10
- it { expect(subject).to callback(:column_reset).after(:destroy) }
10
+ it { is_expected.to callback(:column_reset).after(:destroy) }
11
11
  end
12
12
 
13
13
  context "validations" do
14
- it { expect(subject).to validate_presence_of(:content) }
15
- it { expect(subject).to validate_presence_of(:name) }
16
- it { expect(subject).to validate_presence_of(:slug) }
14
+ it { is_expected.to validate_presence_of(:content) }
15
+ it { is_expected.to validate_presence_of(:name) }
16
+ it { is_expected.to validate_presence_of(:slug) }
17
17
 
18
- it { expect(subject).to have_db_index(:slug).unique(true) }
18
+ it { is_expected.to allow_value("{{ foo }}").for(:content) }
19
+ it { is_expected.to_not allow_value("{{ foo }").for(:content) }
19
20
 
20
- it { expect(subject).to allow_value("{{ foo }}").for(:content) }
21
- it { expect(subject).not_to allow_value("{{ foo }").for(:content) }
21
+ it "has a unique slug scoped to Site" do
22
+ resource = build(:widget)
23
+
24
+ expect(resource)
25
+ .to validate_uniqueness_of(:slug).scoped_to(:site_id).case_insensitive
26
+ end
22
27
  end
23
28
 
24
29
  context "associations" do
25
- it { expect(subject).to belong_to(:site) }
26
- it { expect(subject).to belong_to(:template) }
30
+ it { is_expected.to belong_to(:site) }
31
+
32
+ it "belongs to Template" do
33
+ expect(subject).to(
34
+ belong_to(:template).conditions(partial: true)
35
+ .class_name("Archangel::Template")
36
+ )
37
+ end
38
+ end
39
+
40
+ context "#to_param" do
41
+ it "uses `slug` as the identifier for routes" do
42
+ resource = build(:widget, slug: "foo")
43
+
44
+ expect(resource.to_param).to eq("foo")
45
+ end
46
+ end
47
+
48
+ context "#column_reset" do
49
+ before { ::Timecop.freeze }
50
+ after { ::Timecop.return }
51
+
52
+ it "resets `slug` to `slug` + current time" do
53
+ resource = create(:widget)
54
+
55
+ slug = resource.slug
56
+
57
+ resource.destroy!
58
+
59
+ expect(resource.slug).to eq "#{Time.current.to_i}_#{slug}"
60
+ end
27
61
  end
28
62
  end
29
63
  end
@@ -6,17 +6,34 @@ module Archangel
6
6
  RSpec.describe AssetPolicy, type: :policy do
7
7
  subject { described_class.new(user, record) }
8
8
 
9
- let(:user) { create(:user) }
10
9
  let(:record) { create(:asset) }
11
10
 
12
- it { should permit(:index) }
13
- it { should permit(:show) }
14
- it { should permit(:create) }
15
- it { should permit(:new) }
16
- it { should permit(:update) }
17
- it { should permit(:edit) }
18
- it { should permit(:destroy) }
11
+ context "with `admin` role" do
12
+ let(:user) { create(:user, :admin) }
19
13
 
20
- it { should permit(:wysiwyg) }
14
+ it { is_expected.to permit(:index) }
15
+ it { is_expected.to permit(:show) }
16
+ it { is_expected.to permit(:new) }
17
+ it { is_expected.to permit(:create) }
18
+ it { is_expected.to permit(:edit) }
19
+ it { is_expected.to permit(:update) }
20
+ it { is_expected.to permit(:destroy) }
21
+
22
+ it { is_expected.to permit(:wysiwyg) }
23
+ end
24
+
25
+ context "with `editor` role" do
26
+ let(:user) { create(:user, :editor) }
27
+
28
+ it { is_expected.to permit(:index) }
29
+ it { is_expected.to permit(:show) }
30
+ it { is_expected.to permit(:new) }
31
+ it { is_expected.to permit(:create) }
32
+ it { is_expected.to permit(:edit) }
33
+ it { is_expected.to permit(:update) }
34
+ it { is_expected.to permit(:destroy) }
35
+
36
+ it { is_expected.to permit(:wysiwyg) }
37
+ end
21
38
  end
22
39
  end
@@ -6,15 +6,30 @@ module Archangel
6
6
  RSpec.describe CollectionPolicy, type: :policy do
7
7
  subject { described_class.new(user, record) }
8
8
 
9
- let(:user) { create(:user) }
10
9
  let(:record) { create(:collection) }
11
10
 
12
- it { should permit(:index) }
13
- it { should permit(:show) }
14
- it { should permit(:create) }
15
- it { should permit(:new) }
16
- it { should permit(:update) }
17
- it { should permit(:edit) }
18
- it { should permit(:destroy) }
11
+ context "with `admin` role" do
12
+ let(:user) { create(:user, :admin) }
13
+
14
+ it { is_expected.to permit(:index) }
15
+ it { is_expected.to permit(:show) }
16
+ it { is_expected.to permit(:new) }
17
+ it { is_expected.to permit(:create) }
18
+ it { is_expected.to permit(:edit) }
19
+ it { is_expected.to permit(:update) }
20
+ it { is_expected.to permit(:destroy) }
21
+ end
22
+
23
+ context "with `editor` role" do
24
+ let(:user) { create(:user, :editor) }
25
+
26
+ it { is_expected.to permit(:index) }
27
+ it { is_expected.to permit(:show) }
28
+ it { is_expected.to permit(:new) }
29
+ it { is_expected.to permit(:create) }
30
+ it { is_expected.to permit(:edit) }
31
+ it { is_expected.to permit(:update) }
32
+ it { is_expected.to permit(:destroy) }
33
+ end
19
34
  end
20
35
  end
@@ -6,17 +6,34 @@ module Archangel
6
6
  RSpec.describe EntryPolicy, type: :policy do
7
7
  subject { described_class.new(user, record) }
8
8
 
9
- let(:user) { create(:user) }
10
9
  let(:record) { create(:entry) }
11
10
 
12
- it { should permit(:index) }
13
- it { should permit(:show) }
14
- it { should permit(:create) }
15
- it { should permit(:new) }
16
- it { should permit(:update) }
17
- it { should permit(:edit) }
18
- it { should permit(:destroy) }
11
+ context "with `admin` role" do
12
+ let(:user) { create(:user, :admin) }
19
13
 
20
- it { should permit(:sort) }
14
+ it { is_expected.to permit(:index) }
15
+ it { is_expected.to permit(:show) }
16
+ it { is_expected.to permit(:new) }
17
+ it { is_expected.to permit(:create) }
18
+ it { is_expected.to permit(:edit) }
19
+ it { is_expected.to permit(:update) }
20
+ it { is_expected.to permit(:destroy) }
21
+
22
+ it { is_expected.to permit(:sort) }
23
+ end
24
+
25
+ context "with `editor` role" do
26
+ let(:user) { create(:user, :editor) }
27
+
28
+ it { is_expected.to permit(:index) }
29
+ it { is_expected.to permit(:show) }
30
+ it { is_expected.to permit(:new) }
31
+ it { is_expected.to permit(:create) }
32
+ it { is_expected.to permit(:edit) }
33
+ it { is_expected.to permit(:update) }
34
+ it { is_expected.to permit(:destroy) }
35
+
36
+ it { is_expected.to permit(:sort) }
37
+ end
21
38
  end
22
39
  end
@@ -6,15 +6,30 @@ module Archangel
6
6
  RSpec.describe PagePolicy, type: :policy do
7
7
  subject { described_class.new(user, record) }
8
8
 
9
- let(:user) { create(:user) }
10
9
  let(:record) { create(:page) }
11
10
 
12
- it { should permit(:index) }
13
- it { should permit(:show) }
14
- it { should permit(:create) }
15
- it { should permit(:new) }
16
- it { should permit(:update) }
17
- it { should permit(:edit) }
18
- it { should permit(:destroy) }
11
+ context "with `admin` role" do
12
+ let(:user) { create(:user, :admin) }
13
+
14
+ it { is_expected.to permit(:index) }
15
+ it { is_expected.to permit(:show) }
16
+ it { is_expected.to permit(:new) }
17
+ it { is_expected.to permit(:create) }
18
+ it { is_expected.to permit(:edit) }
19
+ it { is_expected.to permit(:update) }
20
+ it { is_expected.to permit(:destroy) }
21
+ end
22
+
23
+ context "with `editor` role" do
24
+ let(:user) { create(:user, :editor) }
25
+
26
+ it { is_expected.to permit(:index) }
27
+ it { is_expected.to permit(:show) }
28
+ it { is_expected.to permit(:new) }
29
+ it { is_expected.to permit(:create) }
30
+ it { is_expected.to permit(:edit) }
31
+ it { is_expected.to permit(:update) }
32
+ it { is_expected.to permit(:destroy) }
33
+ end
19
34
  end
20
35
  end
@@ -6,25 +6,27 @@ module Archangel
6
6
  RSpec.describe SitePolicy, type: :policy do
7
7
  subject { described_class.new(user, record) }
8
8
 
9
- let(:user) { create(:user) }
10
9
  let(:record) { create(:site) }
11
10
 
12
- it { should permit(:show) }
13
-
14
11
  context "with `admin` role" do
15
12
  let(:user) { create(:user, :admin) }
16
13
 
17
- it { should permit(:update) }
18
- it { should permit(:edit) }
19
- it { should permit(:sample) }
14
+ it { is_expected.to permit(:show) }
15
+ it { is_expected.to permit(:update) }
16
+ it { is_expected.to permit(:edit) }
17
+
18
+ it { is_expected.to permit(:sample) }
20
19
  end
21
20
 
22
21
  context "with `editor` role" do
23
22
  let(:user) { create(:user, :editor) }
24
23
 
25
- it { should_not permit(:update) }
26
- it { should_not permit(:edit) }
27
- it { should permit(:sample) }
24
+ it { is_expected.to permit(:show) }
25
+
26
+ it { is_expected.to permit(:sample) }
27
+
28
+ it { is_expected.to_not permit(:update) }
29
+ it { is_expected.to_not permit(:edit) }
28
30
  end
29
31
  end
30
32
  end
@@ -6,15 +6,30 @@ module Archangel
6
6
  RSpec.describe TemplatePolicy, type: :policy do
7
7
  subject { described_class.new(user, record) }
8
8
 
9
- let(:user) { create(:user) }
10
9
  let(:record) { create(:template) }
11
10
 
12
- it { should permit(:index) }
13
- it { should permit(:show) }
14
- it { should permit(:create) }
15
- it { should permit(:new) }
16
- it { should permit(:update) }
17
- it { should permit(:edit) }
18
- it { should permit(:destroy) }
11
+ context "with `admin` role" do
12
+ let(:user) { create(:user, :admin) }
13
+
14
+ it { is_expected.to permit(:index) }
15
+ it { is_expected.to permit(:show) }
16
+ it { is_expected.to permit(:new) }
17
+ it { is_expected.to permit(:create) }
18
+ it { is_expected.to permit(:edit) }
19
+ it { is_expected.to permit(:update) }
20
+ it { is_expected.to permit(:destroy) }
21
+ end
22
+
23
+ context "with `editor` role" do
24
+ let(:user) { create(:user, :editor) }
25
+
26
+ it { is_expected.to permit(:index) }
27
+ it { is_expected.to permit(:show) }
28
+ it { is_expected.to permit(:new) }
29
+ it { is_expected.to permit(:create) }
30
+ it { is_expected.to permit(:edit) }
31
+ it { is_expected.to permit(:update) }
32
+ it { is_expected.to permit(:destroy) }
33
+ end
19
34
  end
20
35
  end