contentful_bootstrap 1.6.0 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +26 -0
  3. data/.rubocop_todo.yml +123 -0
  4. data/.travis.yml +6 -0
  5. data/CHANGELOG.md +25 -0
  6. data/Gemfile +1 -0
  7. data/Guardfile +5 -0
  8. data/README.md +40 -14
  9. data/Rakefile +7 -0
  10. data/bin/contentful_bootstrap +33 -22
  11. data/contentful_bootstrap.gemspec +7 -0
  12. data/lib/contentful/bootstrap.rb +7 -5
  13. data/lib/contentful/bootstrap/command_runner.rb +45 -0
  14. data/lib/contentful/bootstrap/commands.rb +3 -168
  15. data/lib/contentful/bootstrap/commands/base.rb +66 -0
  16. data/lib/contentful/bootstrap/commands/create_space.rb +111 -0
  17. data/lib/contentful/bootstrap/commands/generate_json.rb +41 -0
  18. data/lib/contentful/bootstrap/commands/generate_token.rb +52 -0
  19. data/lib/contentful/bootstrap/constants.rb +2 -2
  20. data/lib/contentful/bootstrap/generator.rb +94 -0
  21. data/lib/contentful/bootstrap/server.rb +25 -17
  22. data/lib/contentful/bootstrap/support.rb +3 -2
  23. data/lib/contentful/bootstrap/templates.rb +4 -4
  24. data/lib/contentful/bootstrap/templates/base.rb +51 -30
  25. data/lib/contentful/bootstrap/templates/blog.rb +33 -33
  26. data/lib/contentful/bootstrap/templates/catalogue.rb +103 -103
  27. data/lib/contentful/bootstrap/templates/gallery.rb +55 -56
  28. data/lib/contentful/bootstrap/templates/json_template.rb +22 -16
  29. data/lib/contentful/bootstrap/templates/links.rb +2 -2
  30. data/lib/contentful/bootstrap/templates/links/asset.rb +2 -2
  31. data/lib/contentful/bootstrap/templates/links/base.rb +3 -3
  32. data/lib/contentful/bootstrap/templates/links/entry.rb +2 -2
  33. data/lib/contentful/bootstrap/token.rb +32 -31
  34. data/lib/contentful/bootstrap/version.rb +1 -1
  35. data/spec/contentful/bootstrap/command_runner_spec.rb +111 -0
  36. data/spec/contentful/bootstrap/commands/base_spec.rb +102 -0
  37. data/spec/contentful/bootstrap/commands/create_space_spec.rb +72 -0
  38. data/spec/contentful/bootstrap/commands/generate_json_spec.rb +64 -0
  39. data/spec/contentful/bootstrap/commands/generate_token_spec.rb +82 -0
  40. data/spec/contentful/bootstrap/generator_spec.rb +15 -0
  41. data/spec/contentful/bootstrap/server_spec.rb +154 -0
  42. data/spec/contentful/bootstrap/support_spec.rb +27 -0
  43. data/spec/contentful/bootstrap/templates/base_spec.rb +34 -0
  44. data/spec/contentful/bootstrap/templates/blog_spec.rb +32 -0
  45. data/spec/contentful/bootstrap/templates/catalogue_spec.rb +40 -0
  46. data/spec/contentful/bootstrap/templates/gallery_spec.rb +40 -0
  47. data/spec/contentful/bootstrap/templates/json_template_spec.rb +52 -0
  48. data/spec/contentful/bootstrap/templates/links/asset_spec.rb +23 -0
  49. data/spec/contentful/bootstrap/templates/links/base_spec.rb +31 -0
  50. data/spec/contentful/bootstrap/templates/links/entry_spec.rb +23 -0
  51. data/spec/contentful/bootstrap/token_spec.rb +143 -0
  52. data/spec/fixtures/ini_fixtures/contentfulrc.ini +2 -0
  53. data/spec/fixtures/ini_fixtures/no_global.ini +2 -0
  54. data/spec/fixtures/ini_fixtures/no_token.ini +1 -0
  55. data/spec/fixtures/ini_fixtures/sections.ini +5 -0
  56. data/spec/fixtures/json_fixtures/issue_22.json +77 -0
  57. data/spec/fixtures/json_fixtures/simple.json +34 -0
  58. data/spec/fixtures/json_fixtures/wl1z0pal05vy.json +437 -0
  59. data/spec/fixtures/vcr_fixtures/generate_json.yml +384 -0
  60. data/spec/fixtures/vcr_fixtures/issue_22.yml +2488 -0
  61. data/spec/spec_helper.rb +51 -0
  62. metadata +167 -4
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ class ResponseDouble
4
+ def object
5
+ {'accessToken' => 'foo'}
6
+ end
7
+ end
8
+
9
+ class ErrorDouble < Contentful::Management::Error
10
+ def initialize
11
+ end
12
+
13
+ def object
14
+ self.class.new
15
+ end
16
+ end
17
+
18
+ describe Contentful::Bootstrap::Commands::GenerateToken do
19
+ let(:path) { File.expand_path(File.join('spec', 'fixtures', 'ini_fixtures', 'contentfulrc.ini')) }
20
+ let(:token) { Contentful::Bootstrap::Token.new path }
21
+ subject { Contentful::Bootstrap::Commands::GenerateToken.new token, 'foo', 'bar', false }
22
+ let(:space_double) { SpaceDouble.new }
23
+
24
+ describe 'instance methods' do
25
+ before do
26
+ subject.send(:management_client_init)
27
+ end
28
+
29
+ describe '#run' do
30
+ it 'fetches space from api if space is a string' do
31
+ allow(subject).to receive(:gets) { 'n' }
32
+ allow_any_instance_of(Contentful::Management::Request).to receive(:post) { ResponseDouble.new }
33
+ expect(Contentful::Management::Space).to receive(:find).with('foo') { space_double }
34
+
35
+ subject.run
36
+ end
37
+
38
+ it 'uses space if space is not a string' do
39
+ allow(subject).to receive(:gets) { 'n' }
40
+ allow_any_instance_of(Contentful::Management::Request).to receive(:post) { ResponseDouble.new }
41
+ expect(Contentful::Management::Space).not_to receive(:find).with('foo') { space_double }
42
+
43
+ subject.instance_variable_set(:@actual_space, space_double)
44
+
45
+ subject.run
46
+ end
47
+
48
+ it 'returns access token' do
49
+ allow(subject).to receive(:gets) { 'n' }
50
+ allow_any_instance_of(Contentful::Management::Request).to receive(:post) { ResponseDouble.new }
51
+ allow(Contentful::Management::Space).to receive(:find).with('foo') { space_double }
52
+
53
+ expect(subject.run).to eq 'foo'
54
+ end
55
+
56
+ it 'fails if API returns an error' do
57
+ allow(subject).to receive(:gets) { 'n' }
58
+ allow_any_instance_of(Contentful::Management::Request).to receive(:post) { ErrorDouble.new }
59
+ allow(Contentful::Management::Space).to receive(:find).with('foo') { space_double }
60
+
61
+ expect { subject.run }.to raise_error ErrorDouble
62
+ end
63
+
64
+ it 'token gets written if user input is other than no' do
65
+ allow(subject).to receive(:gets) { 'y' }
66
+ allow_any_instance_of(Contentful::Management::Request).to receive(:post) { ResponseDouble.new }
67
+ allow(Contentful::Management::Space).to receive(:find).with('foo') { space_double }
68
+
69
+ expect(token).to receive(:write_access_token).with('foobar', 'foo')
70
+ expect(token).to receive(:write_space_id).with('foobar', 'foobar')
71
+
72
+ subject.run
73
+ end
74
+ end
75
+ end
76
+
77
+ describe 'attributes' do
78
+ it ':token_name' do
79
+ expect(subject.token_name).to eq 'bar'
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contentful::Bootstrap::Generator do
4
+ subject { Contentful::Bootstrap::Generator.new('wl1z0pal05vy', '48d7db7d4cd9d09df573c251d456f4acc72141b92f36e57f8684b36cf5cfff6e') }
5
+
6
+ describe 'JSON template generator' do
7
+ it 'can generate a JSON template for a given space' do
8
+ vcr('generate_json') {
9
+ json_fixture('wl1z0pal05vy') { |json|
10
+ expect(subject.generate_json).to eq JSON.pretty_generate(json)
11
+ }
12
+ }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,154 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contentful::Bootstrap::OAuthEchoView do
4
+ describe 'instance methods' do
5
+ it '#render' do
6
+ expect(subject.render).to include(
7
+ 'html',
8
+ 'script',
9
+ 'access_token',
10
+ 'window.location.replace',
11
+ 'save_token'
12
+ )
13
+ end
14
+ end
15
+ end
16
+
17
+ describe Contentful::Bootstrap::ThanksView do
18
+ describe 'instance methods' do
19
+ it '#render' do
20
+ expect(subject.render).to include(
21
+ 'html',
22
+ 'Contentful Bootstrap',
23
+ 'Thanks!'
24
+ )
25
+ end
26
+ end
27
+ end
28
+
29
+ describe Contentful::Bootstrap::IndexController do
30
+ subject { Contentful::Bootstrap::IndexController.new(ServerDouble.new) }
31
+
32
+ describe 'instance methods' do
33
+ describe '#do_GET' do
34
+ it 'launches browser' do
35
+ expect(Launchy).to receive(:open)
36
+ subject.do_GET(RequestDouble.new, ResponseDouble.new)
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ describe Contentful::Bootstrap::OAuthCallbackController do
43
+ subject { Contentful::Bootstrap::OAuthCallbackController.new(ServerDouble.new) }
44
+ let(:response_double) { ResponseDouble.new }
45
+
46
+ describe 'instance methods' do
47
+ describe '#do_GET' do
48
+ it 'renders OAuthEchoView' do
49
+ subject.do_GET(RequestDouble.new, response_double)
50
+ expect(response_double.body).to eq Contentful::Bootstrap::OAuthEchoView.new.render
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ describe Contentful::Bootstrap::SaveTokenController do
57
+ let(:path) { File.expand_path(File.join('spec', 'fixtures', 'ini_fixtures', 'contentfulrc.ini')) }
58
+ let(:token) { Contentful::Bootstrap::Token.new path }
59
+ subject { Contentful::Bootstrap::SaveTokenController.new(ServerDouble.new, token) }
60
+ let(:response_double) { ResponseDouble.new }
61
+ let(:request_double) { RequestDouble.new }
62
+
63
+ describe 'instance methods' do
64
+ describe '#do_GET' do
65
+ it 'writes token' do
66
+ request_double.query = {'token' => 'foo'}
67
+
68
+ expect(token).to receive(:write).with('foo')
69
+
70
+ subject.do_GET(request_double, response_double)
71
+ end
72
+
73
+ it 'renders ThanksView' do
74
+ request_double.query = {'token' => 'foo'}
75
+ allow(token).to receive(:write)
76
+
77
+ subject.do_GET(request_double, response_double)
78
+
79
+ expect(response_double.body).to eq Contentful::Bootstrap::ThanksView.new.render
80
+ end
81
+ end
82
+ end
83
+
84
+ describe 'attributes' do
85
+ it ':token' do
86
+ expect(subject.token).to eq token
87
+ end
88
+ end
89
+ end
90
+
91
+ describe Contentful::Bootstrap::Server do
92
+ let(:path) { File.expand_path(File.join('spec', 'fixtures', 'ini_fixtures', 'contentfulrc.ini')) }
93
+ let(:token) { Contentful::Bootstrap::Token.new path }
94
+ subject { Contentful::Bootstrap::Server.new(token) }
95
+
96
+ before do
97
+ allow_any_instance_of(WEBrick::HTTPServer).to receive(:start)
98
+ allow(WEBrick::Utils).to receive(:create_listeners) { [] } # Mock TCP Port binding
99
+ end
100
+
101
+ describe 'instance methods' do
102
+ describe '#start' do
103
+ it 'runs server in a new thread' do
104
+ expect(Thread).to receive(:new)
105
+ subject.start
106
+ end
107
+ end
108
+
109
+ describe '#stop' do
110
+ it 'shutdowns webrick' do
111
+ expect(subject.server).to receive(:shutdown)
112
+ subject.stop
113
+ end
114
+ end
115
+
116
+ describe '#running?' do
117
+ it 'returns true if webrick is running' do
118
+ expect(subject.server).to receive(:status) { :Running }
119
+ expect(subject.running?).to be_truthy
120
+ end
121
+
122
+ it 'returns false if webrick is not running' do
123
+ expect(subject.server).to receive(:status) { :Stop }
124
+ expect(subject.running?).to be_falsey
125
+ end
126
+ end
127
+ end
128
+
129
+ describe 'attributes' do
130
+ describe ':server' do
131
+ it 'creates the webrick server' do
132
+ expect(subject.server).to be_kind_of(WEBrick::HTTPServer)
133
+ end
134
+
135
+ describe 'mounted endpoints' do
136
+ before do
137
+ @mount_table = subject.server.instance_variable_get(:@mount_tab)
138
+ end
139
+
140
+ it '/' do
141
+ expect(@mount_table['/'][0]).to eq(Contentful::Bootstrap::IndexController)
142
+ end
143
+
144
+ it '/oauth_callback' do
145
+ expect(@mount_table['/oauth_callback'][0]).to eq(Contentful::Bootstrap::OAuthCallbackController)
146
+ end
147
+
148
+ it '/save_token' do
149
+ expect(@mount_table['/save_token'][0]).to eq(Contentful::Bootstrap::SaveTokenController)
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ class Double
4
+ include Contentful::Bootstrap::Support
5
+
6
+ def write
7
+ $stderr.write('foo\n')
8
+ end
9
+
10
+ def muted_write
11
+ silence_stderr do
12
+ write
13
+ end
14
+ end
15
+ end
16
+
17
+ describe Contentful::Bootstrap::Support do
18
+ subject { Double.new }
19
+
20
+ describe 'module methods' do
21
+ it '#silence_stderr' do
22
+ expect { subject.write }.to output('foo\n').to_stderr
23
+
24
+ expect { subject.muted_write }.to_not output.to_stderr
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contentful::Bootstrap::Templates::Base do
4
+ let(:space) { Contentful::Management::Space.new }
5
+ subject { Contentful::Bootstrap::Templates::Base.new(space) }
6
+
7
+ describe 'instance methods' do
8
+ it '#content_types' do
9
+ expect(subject.content_types).to eq []
10
+ end
11
+
12
+ it '#entries' do
13
+ expect(subject.entries).to eq({})
14
+ end
15
+
16
+ it '#assets' do
17
+ expect(subject.assets).to eq []
18
+ end
19
+
20
+ it '#run' do
21
+ ['content_types', 'assets', 'entries'].each do |name|
22
+ expect(subject).to receive("create_#{name}".to_sym)
23
+ end
24
+
25
+ subject.run
26
+ end
27
+ end
28
+
29
+ describe 'attributes' do
30
+ it ':space' do
31
+ expect(subject.space).to eq space
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contentful::Bootstrap::Templates::Blog do
4
+ let(:space) { Contentful::Management::Space.new }
5
+ subject { Contentful::Bootstrap::Templates::Blog.new(space) }
6
+
7
+ describe 'content types' do
8
+ it 'has Post content type' do
9
+ expect(subject.content_types.detect { |ct| ct['id'] == 'post' }).to be_truthy
10
+ end
11
+
12
+ it 'has Author content type' do
13
+ expect(subject.content_types.detect { |ct| ct['id'] == 'author' }).to be_truthy
14
+ end
15
+ end
16
+
17
+ describe 'entries' do
18
+ it 'has 2 posts' do
19
+ expect(subject.entries['post'].size).to eq 2
20
+ end
21
+
22
+ it 'has 2 authors' do
23
+ expect(subject.entries['author'].size).to eq 2
24
+ end
25
+ end
26
+
27
+ describe 'assets' do
28
+ it 'has no assets' do
29
+ expect(subject.assets.empty?).to be_truthy
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contentful::Bootstrap::Templates::Catalogue do
4
+ let(:space) { Contentful::Management::Space.new }
5
+ subject { Contentful::Bootstrap::Templates::Catalogue.new(space) }
6
+
7
+ describe 'content types' do
8
+ it 'has Brand content type' do
9
+ expect(subject.content_types.detect { |ct| ct['id'] == 'brand' }).to be_truthy
10
+ end
11
+
12
+ it 'has Category content type' do
13
+ expect(subject.content_types.detect { |ct| ct['id'] == 'category' }).to be_truthy
14
+ end
15
+
16
+ it 'has Product content type' do
17
+ expect(subject.content_types.detect { |ct| ct['id'] == 'product' }).to be_truthy
18
+ end
19
+ end
20
+
21
+ describe 'entries' do
22
+ it 'has 2 brands' do
23
+ expect(subject.entries['brand'].size).to eq 2
24
+ end
25
+
26
+ it 'has 2 categories' do
27
+ expect(subject.entries['category'].size).to eq 2
28
+ end
29
+
30
+ it 'has 2 products' do
31
+ expect(subject.entries['product'].size).to eq 2
32
+ end
33
+ end
34
+
35
+ describe 'assets' do
36
+ it 'has 6 assets' do
37
+ expect(subject.assets.size).to eq 6
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contentful::Bootstrap::Templates::Gallery do
4
+ let(:space) { Contentful::Management::Space.new }
5
+ subject { Contentful::Bootstrap::Templates::Gallery.new(space) }
6
+
7
+ describe 'content types' do
8
+ it 'has Author content type' do
9
+ expect(subject.content_types.detect { |ct| ct['id'] == 'author' }).to be_truthy
10
+ end
11
+
12
+ it 'has Image content type' do
13
+ expect(subject.content_types.detect { |ct| ct['id'] == 'image' }).to be_truthy
14
+ end
15
+
16
+ it 'has Gallery content type' do
17
+ expect(subject.content_types.detect { |ct| ct['id'] == 'gallery' }).to be_truthy
18
+ end
19
+ end
20
+
21
+ describe 'entries' do
22
+ it 'has 1 author' do
23
+ expect(subject.entries['author'].size).to eq 1
24
+ end
25
+
26
+ it 'has 2 images' do
27
+ expect(subject.entries['image'].size).to eq 2
28
+ end
29
+
30
+ it 'has 1 gallery' do
31
+ expect(subject.entries['gallery'].size).to eq 1
32
+ end
33
+ end
34
+
35
+ describe 'assets' do
36
+ it 'has 2 assets' do
37
+ expect(subject.assets.size).to eq 2
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe Contentful::Bootstrap::Templates::JsonTemplate do
4
+ let(:space) { Contentful::Management::Space.new }
5
+ let(:path) { File.expand_path(File.join('spec', 'fixtures', 'json_fixtures', 'simple.json')) }
6
+ subject { Contentful::Bootstrap::Templates::JsonTemplate.new space, path }
7
+
8
+ describe 'instance methods' do
9
+ it '#content_types' do
10
+ expect(subject.content_types.first).to eq(
11
+ {
12
+ "id" => "cat",
13
+ "name" => "Cat",
14
+ "displayField" => "name",
15
+ "fields" => [
16
+ {
17
+ "id" => "name",
18
+ "name" => "Name",
19
+ "type" => "Symbol"
20
+ }
21
+ ]
22
+ }
23
+ )
24
+
25
+ expect(subject.content_types.size).to eq(1)
26
+ end
27
+
28
+ it '#assets' do
29
+ expect(subject.assets.first).to include(
30
+ {
31
+ "id" => "cat_asset",
32
+ "title" => "Cat"
33
+ }
34
+ )
35
+
36
+ expect(subject.assets.first['file']).to be_kind_of(Contentful::Management::File)
37
+
38
+ expect(subject.assets.size).to eq(1)
39
+ end
40
+
41
+ it '#entries' do
42
+ expect(subject.entries.keys).to include("cat")
43
+ expect(subject.entries["cat"].size).to eq(1)
44
+ expect(subject.entries["cat"].first).to eq(
45
+ {
46
+ "id" => "nyancat",
47
+ "name" => "Nyan Cat"
48
+ }
49
+ )
50
+ end
51
+ end
52
+ end