lady_josephine 0.0.4 → 0.5.0

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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/lady_josephine/editor_controller.rb +10 -4
  3. data/app/controllers/lady_josephine/images_controller.rb +6 -3
  4. data/app/helpers/lady_josephine/sir_trevor_helper.rb +60 -91
  5. data/app/models/lady_josephine/concerns/model.rb +3 -1
  6. data/app/models/lady_josephine/concerns/sir_trevor_images.rb +5 -7
  7. data/app/models/lady_josephine/image.rb +3 -2
  8. data/config/routes.rb +4 -4
  9. data/lib/lady_josephine/redcarpet/custom_markdown_formatter.rb +3 -0
  10. data/lib/lady_josephine/sir_trevor_view.rb +14 -0
  11. data/lib/lady_josephine/version.rb +1 -1
  12. data/lib/lady_josephine.rb +5 -0
  13. data/spec/controllers/lady_josephine/editor_controller_spec.rb +81 -57
  14. data/spec/controllers/lady_josephine/images_controller_spec.rb +35 -0
  15. data/spec/dummy/app/assets/images/depressed-cat.jpg +0 -0
  16. data/spec/dummy/app/models/article.rb +3 -0
  17. data/spec/dummy/app/models/user.rb +11 -0
  18. data/spec/dummy/config/environments/test.rb +1 -0
  19. data/spec/dummy/config/initializers/devise.rb +265 -0
  20. data/spec/dummy/config/locales/devise.en.yml +60 -0
  21. data/spec/dummy/config/routes.rb +3 -1
  22. data/spec/dummy/db/development.sqlite3 +0 -0
  23. data/spec/dummy/db/migrate/20160307143232_create_articles.rb +9 -0
  24. data/spec/dummy/db/migrate/20160307143714_add_lady_josephine_to_articles.rb +9 -0
  25. data/spec/dummy/db/migrate/20160308091107_create_users.rb +10 -0
  26. data/spec/dummy/db/migrate/20160308131853_add_devise_to_users.rb +49 -0
  27. data/spec/dummy/db/schema.rb +44 -1
  28. data/spec/dummy/db/test.sqlite3 +0 -0
  29. data/spec/dummy/log/development.log +284 -0
  30. data/spec/dummy/log/test.log +19983 -0
  31. data/spec/dummy/public/storage/test/lady_josephine/image/file/1/depressed-cat.jpg +0 -0
  32. data/spec/dummy/public/storage/test/lady_josephine/image/file/1/w1000_depressed-cat.jpg +0 -0
  33. data/spec/dummy/public/storage/test/lady_josephine/image/file/1/w2000_depressed-cat.jpg +0 -0
  34. data/spec/dummy/public/storage/test/lady_josephine/image/file/1/w300_depressed-cat.jpg +0 -0
  35. data/spec/dummy/public/storage/test/lady_josephine/image/file/1/w600_depressed-cat.jpg +0 -0
  36. data/spec/dummy/public/uploads/tmp/1457361805-21265-0640/depressed-cat.jpg +0 -0
  37. data/spec/dummy/public/uploads/tmp/1457361805-21265-0640/w1000_depressed-cat.jpg +0 -0
  38. data/spec/dummy/public/uploads/tmp/1457361805-21265-0640/w300_depressed-cat.jpg +0 -0
  39. data/spec/dummy/public/uploads/tmp/1457361805-21265-5269/w2000_depressed-cat.jpg +0 -0
  40. data/spec/dummy/public/uploads/tmp/1457361805-21265-8125/w600_depressed-cat.jpg +0 -0
  41. data/spec/dummy/public/uploads/tmp/1457361816-21343-4543/w2000_depressed-cat.jpg +0 -0
  42. data/spec/dummy/public/uploads/tmp/1457361816-21343-6347/depressed-cat.jpg +0 -0
  43. data/spec/dummy/public/uploads/tmp/1457361816-21343-6347/w1000_depressed-cat.jpg +0 -0
  44. data/spec/dummy/public/uploads/tmp/1457361816-21343-6347/w300_depressed-cat.jpg +0 -0
  45. data/spec/dummy/public/uploads/tmp/1457361816-21343-7612/w600_depressed-cat.jpg +0 -0
  46. data/spec/dummy/public/uploads/tmp/1457515799-18442-6177/depressed-cat.jpg +0 -0
  47. data/spec/dummy/public/uploads/tmp/1457515799-18442-6177/w1000_depressed-cat.jpg +0 -0
  48. data/spec/dummy/public/uploads/tmp/1457515799-18442-6177/w300_depressed-cat.jpg +0 -0
  49. data/spec/dummy/public/uploads/tmp/1457515800-18442-3701/w2000_depressed-cat.jpg +0 -0
  50. data/spec/dummy/public/uploads/tmp/1457515800-18442-7909/w600_depressed-cat.jpg +0 -0
  51. data/spec/dummy/public/uploads/tmp/1457515954-18760-0051/depressed-cat.jpg +0 -0
  52. data/spec/dummy/public/uploads/tmp/1457515954-18760-0051/w1000_depressed-cat.jpg +0 -0
  53. data/spec/dummy/public/uploads/tmp/1457515954-18760-0051/w300_depressed-cat.jpg +0 -0
  54. data/spec/dummy/public/uploads/tmp/1457515955-18760-3846/w2000_depressed-cat.jpg +0 -0
  55. data/spec/dummy/public/uploads/tmp/1457515955-18760-7040/w600_depressed-cat.jpg +0 -0
  56. data/spec/helper/lady_josephine/helper_spec.rb +29 -0
  57. data/spec/helper/lady_josephine/sir_trevor_helper_spec.rb +166 -0
  58. data/spec/lib/redcarpet/custom_markdown_formatter_spec.rb +98 -0
  59. data/spec/lib/renderer/sir_trevor_renderer_spec.rb +27 -0
  60. data/spec/lib/whitelist_spec.rb +48 -0
  61. data/spec/models/lady_josephine/concerns/model_spec.rb +24 -0
  62. data/spec/models/lady_josephine/concerns/pingable_spec.rb +79 -0
  63. data/spec/models/lady_josephine/concerns/server_uuid_spec.rb +23 -0
  64. data/spec/models/lady_josephine/concerns/sir_trevor_images_spec.rb +50 -0
  65. data/spec/models/lady_josephine/image_spec.rb +68 -0
  66. data/spec/spec_helper.rb +4 -1
  67. metadata +125 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 08931081c421edff4ff267a29010ed27df43c500
4
- data.tar.gz: fe6f745e500f34a055e86fa704e7b756aee19f12
3
+ metadata.gz: 60a6a3687ea48331847dc71805138f3b6538caff
4
+ data.tar.gz: cc3f703f2ee2a6e7fdddc163a22802aa372b0442
5
5
  SHA512:
6
- metadata.gz: f58b27466ad81cdc654cbd00549a31f7bdd6413d7b928800d374e7955fbd6fea6b53159a279d1db6068e953af93e5a5a9347850b938265b2da9714966252d3a7
7
- data.tar.gz: 1a8ff67c4f2516dbddc88067dcc2bc97f116bacc488b04f63f93a368605c66f596652eefefdb09f51bab20ce21f0879b2c4b20999ba62142e18bddbdedbf71bc
6
+ metadata.gz: 7a3ff2974e150f88c654102fbd83740f1d892044309be6f4afbf59f8d069e5384156233c273493a6eae6458167ab86af4f0e0e0d054c5c3d1c73ec1b71af395b
7
+ data.tar.gz: debb9ad919884f916f89537a27e5671ecbb4735f0f52eca743125d4943616d67559b754ca97498ab0f096932d8b8abd4878b093a6c6f87e10d4eab12097bd9e9
@@ -12,9 +12,10 @@ module LadyJosephine
12
12
  result[:ping][:state] = "CONFLICT"
13
13
  end
14
14
 
15
- result[:ping][:ping_date] = @resource.ping_date
16
- result[:ping][:user_id] = @resource.ping_user.try :id
17
- result[:ping][:user_name] = @resource.ping_user.try :name
15
+ result[:ping][:ping_date] = @resource.lady_josephine_ping_date
16
+ result[:ping][:user_id] = @resource.lady_josephine_ping_user.try :id
17
+ result[:ping][:user_name] = @resource.lady_josephine_ping_user.try :name
18
+
18
19
  render json: result
19
20
  end
20
21
  end
@@ -28,7 +29,8 @@ module LadyJosephine
28
29
  private
29
30
 
30
31
  def find_resource
31
- if (@resource = params[:resource].capitalize.constantize.where(server_uuid: params[:id]).first)
32
+ resource_class = whitelisted_class(params[:resource])
33
+ if (resource_class && @resource = resource_class.where(lady_josephine_server_uuid: params[:id]).first)
32
34
  @resource
33
35
  else
34
36
  render nothing: true, status: 404
@@ -36,5 +38,9 @@ module LadyJosephine
36
38
  end
37
39
  end
38
40
 
41
+ def whitelisted_class(resource)
42
+ resource.capitalize.constantize if LadyJosephine::Whitelist.instance.is_whitelisted?(resource)
43
+ end
44
+
39
45
  end
40
46
  end
@@ -4,15 +4,18 @@ module LadyJosephine
4
4
  def create
5
5
  image = Image.from_params image_params
6
6
 
7
- if image.save
7
+ if image && image.save
8
8
  response = {file: {url: image.file.url}}
9
9
  render json: response.as_json, status: 200
10
- else
10
+ elsif image
11
11
  render json: image.file.errors, status: 500
12
+ else
13
+ render json: { error: 'Could not save Image.'} , status: 500
12
14
  end
13
-
14
15
  end
15
16
 
17
+ private
18
+
16
19
  def image_params
17
20
  params.require(:attachment).permit([:name, :file])
18
21
  params.require("block-uuid")
@@ -3,23 +3,12 @@ require 'redcarpet'
3
3
  module LadyJosephine
4
4
  module SirTrevorHelper
5
5
 
6
- def render_sir_trevor(json, without_notes = true, image_type = 'large')
7
- if hash = parse_sir_trevor(json)
8
- first_definition_block = true
9
- hash.map { |object|
10
- if object["data"]["note"] != "yes" || !without_notes
11
- if object["type"] == "definition"
12
- options = {first: first_definition_block}
13
- first_definition_block = false
14
- render_sir_trevor_block(object, image_type, options)
15
- else
16
- render_sir_trevor_block(object, image_type)
17
- end
18
- end
19
- }.compact.join.html_safe
20
- else
21
- ''
22
- end
6
+ def render_sir_trevor(json, without_notes = true)
7
+ parse_sir_trevor(json).map do |object|
8
+ if object["data"]["note"] != "yes" || !without_notes
9
+ render_sir_trevor_block(object)
10
+ end
11
+ end.compact.join.html_safe
23
12
  end
24
13
 
25
14
  def component_attributes_for(block, classes)
@@ -50,82 +39,74 @@ module LadyJosephine
50
39
  tag "img", options.merge(:src => src, :srcset => srcset, :sizes => sizes)
51
40
  end
52
41
 
53
- def protocol_relative(path)
54
- path.gsub(/\Ahttps?:/, '')
55
- end
56
-
57
42
  def sir_trevor_video(block)
58
-
59
43
  if block["source"] == "youtube"
60
-
61
- options = {
62
- frameborder: 0,
63
- wmode: nil,
64
- autoplay: false,
65
- hide_related: true,
66
- showinfo: 0,
67
- color: "white",
68
- modestbranding: 1,
69
- iv_load_policy: 3,
70
- theme: "light",
71
- fullscreen: block["note"] == "yes" ? 0 : 1
72
- }
73
-
74
- src = "//www.youtube.com/embed/#{block['remote_id']}"
75
-
76
- params = []
77
- params << "wmode=#{options[:wmode]}" if options[:wmode]
78
- params << "autoplay=1" if options[:autoplay]
79
- params << "rel=0" if options[:hide_related]
80
- params << "showinfo=#{options[:showinfo]}" if options[:showinfo]
81
- params << "modestbranding=#{options[:modestbranding]}" if options[:modestbranding]
82
- params << "color=#{options[:color]}" if options[:color]
83
- params << "iv_load_policy=#{options[:iv_load_policy]}" if options[:iv_load_policy]
84
- params << "theme=#{options[:theme]}" if options[:theme]
85
- params << "fs=#{options[:fullscreen]}" if options[:fullscreen]
86
-
87
- src += "?#{params.join '&'}" unless params.empty?
88
-
89
- %{<div class="ratio-container youtube-block" data-youtube-url=#{src} data-video-id=#{block['remote_id']}></div>}
90
-
91
-
44
+ sir_trevor_video_youtube(block)
92
45
  elsif block["source"] == "vimeo"
46
+ sir_trevor_video_vimeo(block)
47
+ else
48
+ ""
49
+ end
50
+ end
93
51
 
94
- options = {
95
- show_title: false,
96
- show_byline: false,
97
- show_portrait: false,
98
- frameborder: 0
99
- }
100
-
101
-
102
- frameborder = options[:frameborder] || 0
103
- src = "//player.vimeo.com/video/#{block['remote_id']}"
104
-
105
- params = []
106
-
107
- params << "title=0" unless options[:show_title]
108
- params << "byline=0" if options[:autoplay]
109
- params << "portrait=0" if options[:hide_related]
52
+ def image_display_width(metadata, height = 620)
53
+ (metadata["w2000"]["ratio"] * height).round
54
+ end
110
55
 
111
- src += "?#{params.join '&'}" unless params.empty?
56
+ private
112
57
 
113
- %{<div class="ratio-container vimeo-block" data-vimeo-url=#{src} data-video-id=#{block['remote_id']}></div>}
58
+ def sir_trevor_video_youtube(block)
59
+ params = {
60
+ frameborder: 0,
61
+ wmode: nil,
62
+ autoplay: 1,
63
+ rel: 0, # hide related
64
+ showinfo: 0,
65
+ color: "white",
66
+ modestbranding: 1,
67
+ iv_load_policy: 3,
68
+ theme: "light",
69
+ fs: block["note"] == "yes" ? 0 : 1, # fullscreen
70
+ rel: 0
71
+ }
72
+
73
+ src = join_url_with_params("//www.youtube.com/embed/#{block['remote_id']}", params)
74
+
75
+ content_tag "div", "", {
76
+ "class" => "ratio-container youtube-block",
77
+ "data-youtube-url" => src,
78
+ "data-video-id" => block['remote_id']
79
+ }
80
+ end
114
81
 
115
- else
82
+ def sir_trevor_video_vimeo(block)
83
+ params = {
84
+ title: 0,
85
+ byline: 0, # autoplay
86
+ portrait: 0, # hide related
87
+ }
116
88
 
117
- ""
89
+ src = join_url_with_params("//player.vimeo.com/video/#{block['remote_id']}", params)
118
90
 
119
- end
91
+ content_tag "div", "", {
92
+ "class" => "ratio-container vimeo-block",
93
+ "data-vimeo-url" => src,
94
+ "data-video-id" => block['remote_id']
95
+ }
96
+ end
120
97
 
98
+ def join_url_with_params(url, params)
99
+ "#{url}?#{params.map{|k,v| "#{k}=#{v}"}.join('&')}"
121
100
  end
122
101
 
123
- private
102
+ def protocol_relative(path)
103
+ path.gsub(/\Ahttps?:/, '')
104
+ end
124
105
 
125
106
  def parse_sir_trevor(json)
126
107
  hash = JSON.parse(json)
127
108
 
128
- return false unless hash.has_key?("data")
109
+ return [] unless hash.has_key?("data")
129
110
  digest hash["data"]
130
111
  end
131
112
 
@@ -157,21 +138,9 @@ module LadyJosephine
157
138
 
158
139
  end
159
140
 
160
- def render_sir_trevor_block(object, image_type = 'large', options = {})
161
- context = Class.new(ActionView::Base) do
162
- include ActionView::RoutingUrlFor
163
- include ApplicationHelper
164
- include Rails.application.routes.url_helpers
165
- include Rails.application.routes.mounted_helpers
166
- include SirTrevorHelper
167
-
168
- def default_url_options
169
- {}
170
- end
171
- end
172
-
141
+ def render_sir_trevor_block(object, options = {})
173
142
  view_name = "lady_josephine/blocks/_#{object['type'].to_s.downcase}_block"
174
- view = context.new(["#{Rails.root}/app/views", "#{__FILE__}/../../../views"], {})
143
+ view = LadyJosephine::SirTrevorView.new(["#{Rails.root}/app/views", "#{__FILE__}/../../../views"], {})
175
144
  view.render(template: view_name, locals: {
176
145
  :block => object['data'],
177
146
  :options => options
@@ -9,10 +9,12 @@ module LadyJosephine
9
9
  include ServerUuid
10
10
  include SirTrevorImages
11
11
 
12
+ belongs_to :lady_josephine_ping_user, class_name: LadyJosephine.user_class_name
13
+
12
14
  LadyJosephine::Whitelist.instance.whitelist(self)
13
15
 
14
16
  def content_data_hash
15
- if self.content_data.present?
17
+ if self.content_data.present? && !(self.content_data == "{}")
16
18
  JSON.parse(self.content_data)
17
19
  else
18
20
  {"server_uuid" => nil}
@@ -3,7 +3,7 @@ module LadyJosephine
3
3
  module SirTrevorImages
4
4
  extend ActiveSupport::Concern
5
5
 
6
- included do |column|
6
+ included do
7
7
 
8
8
  def images
9
9
  files = []
@@ -13,26 +13,24 @@ module LadyJosephine
13
13
  files << block["data"]["file"]["medium"]
14
14
  files << block["data"]["file"]["small"]
15
15
  end
16
- files.map { |f| f["url"] }
16
+ files.map { |f| f.try :[], "url" }.compact
17
17
  end
18
18
 
19
19
  private
20
20
 
21
21
  def image_blocks
22
- self.sir_trevor_unwrap_column["data"].select do |block|
22
+ return [] if sir_trevor_unwrap_column["data"].nil?
23
+ sir_trevor_unwrap_column["data"].select do |block|
23
24
  block['type'] == 'extended_image'
24
25
  end
25
26
  end
26
27
 
27
- end
28
-
29
- class_methods do
30
-
31
28
  def sir_trevor_unwrap_column
32
29
  JSON.parse(self.content_data || "{}")
33
30
  end
34
31
 
35
32
  end
33
+
36
34
  end
37
35
  end
38
36
  end
@@ -9,8 +9,9 @@ module LadyJosephine
9
9
  before_save :update_file_metadata
10
10
 
11
11
  def self.from_params(params)
12
- uploadable_type = params["model-name"]
13
- uploadable_type = allowed_class_name uploadable_type
12
+ uploadable_type = allowed_class_name params["model-name"]
13
+ return nil if uploadable_type.nil?
14
+
14
15
  uploadable_uuid = params["article-uuid"]
15
16
  uploadable_attribute = params["column-name"]
16
17
  uploadable_id = uploadable_type.constantize.find_by(lady_josephine_server_uuid: uploadable_uuid).try :id
data/config/routes.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  LadyJosephine::Engine.routes.draw do
2
2
  resources :images, only: [:create]
3
3
 
4
- controller :editor do
5
- get '/content/:resource/:id/version' => :version
6
- post '/content/:resource/:id/ping' => :ping
7
- end
4
+ controller :editor do
5
+ get 'content/:resource/:id/version' => :version
6
+ post 'content/:resource/:id/ping' => :ping, as: "ping"
7
+ end
8
8
 
9
9
  end
@@ -1,3 +1,6 @@
1
+ require 'addressable/uri'
2
+ require 'redcarpet'
3
+
1
4
  module LadyJosephine
2
5
  module Redcarpet
3
6
  class CustomMarkdownFormatter < ::Redcarpet::Render::SmartyHTML
@@ -0,0 +1,14 @@
1
+ module LadyJosephine
2
+ class SirTrevorView < ActionView::Base
3
+ include ActionView::RoutingUrlFor
4
+ include ApplicationHelper
5
+ include Rails.application.routes.url_helpers
6
+ include Rails.application.routes.mounted_helpers
7
+ include SirTrevorHelper
8
+
9
+ def default_url_options
10
+ {}
11
+ end
12
+ end
13
+
14
+ end
@@ -1,3 +1,3 @@
1
1
  module LadyJosephine
2
- VERSION = "0.0.4"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -12,7 +12,12 @@ module LadyJosephine
12
12
  autoload :CustomMarkdownFormatter, 'lady_josephine/redcarpet/custom_markdown_formatter'
13
13
  end
14
14
 
15
+ autoload :SirTrevorView, 'lady_josephine/sir_trevor_view'
16
+
15
17
  mattr_accessor :mount_path
16
18
  @@mount_path = "/josephine"
17
19
 
20
+ mattr_accessor :user_class_name
21
+ @@user_class_name = "User"
22
+
18
23
  end
@@ -1,58 +1,82 @@
1
+ require 'spec_helper'
1
2
 
2
- # #version
3
-
4
- # describe '#ping' do
5
- # before do
6
- # sign_in current_user
7
- # end
8
- # let(:current_user) { author }
9
-
10
- # after do
11
- # Timecop.return
12
- # end
13
-
14
- # it 'returns 404 if article was not found' do
15
- # post :ping, id: "not-found"
16
- # expect(response.status).to eql 404
17
- # end
18
-
19
- # it 'updates the user if the time was okay' do
20
- # post :ping, id: article.server_uuid
21
- # json = JSON.parse(response.body)
22
- # expect(response.status).to eql 200
23
- # expect(json["ping"]["state"]).to eq "OK"
24
- # expect(json["ping"]["user_id"]).to eq current_user.id
25
- # expect(json["ping"]["user_name"]).to eq current_user.name
26
- # end
27
-
28
- # it 'updates the user if it was forced' do
29
- # Timecop.freeze(Time.local(2014, 10, 10, 1, 0, 15))
30
- # article.ping_date = Time.local(2014, 10, 10, 1, 0, 0)
31
- # article.ping_user = admin
32
- # article.save
33
-
34
- # post :ping, id: article.server_uuid, update: "force"
35
-
36
- # json = JSON.parse(response.body)
37
- # expect(response.status).to eql 200
38
- # expect(json["ping"]["state"]).to eq "OK"
39
- # expect(json["ping"]["user_id"]).to eq current_user.id
40
- # expect(json["ping"]["user_name"]).to eq current_user.name
41
- # end
42
-
43
- # it 'does not update the user if another one edits the content' do
44
- # Timecop.freeze(Time.local(2014, 10, 10, 1, 0, 15))
45
- # article.ping_date = Time.local(2014, 10, 10, 1, 0, 0)
46
- # article.ping_user = admin
47
- # article.save
48
-
49
- # post :ping, id: article.server_uuid
50
-
51
- # json = JSON.parse(response.body)
52
- # expect(response.status).to eql 200
53
- # expect(json["ping"]["state"]).to eq "CONFLICT"
54
- # expect(json["ping"]["user_id"]).to eq admin.id
55
- # expect(json["ping"]["user_name"]).to eq admin.name
56
- # end
57
-
58
- # end
3
+ describe LadyJosephine::EditorController, type: :controller do
4
+ include Devise::TestHelpers
5
+ routes { LadyJosephine::Engine.routes }
6
+
7
+ let(:article) { Article.create title: "Local man thinks wrestling is real", content_data_hash: { "uuid" => "uuid-uuid-uuid", "version" => "1.0" } }
8
+
9
+ describe '#version' do
10
+
11
+ it 'returns 404 if article was not found' do
12
+ get :version, id: "not-found", resource: 'article'
13
+ expect(response.status).to eql 404
14
+ end
15
+
16
+ it 'returns the version if article was found' do
17
+ get :version, id: article.lady_josephine_server_uuid, resource: 'article'
18
+ json = JSON.parse(response.body)
19
+
20
+ expect(response.status).to eql 200
21
+ expect(json["lady_josephine_server_version"]).to eq "1.0"
22
+ end
23
+ end
24
+
25
+ describe '#ping' do
26
+ let(:user) { User.create first_name: "Homer", email: "homer@simpson.com", password: "springfield", password_confirmation: "springfield" }
27
+ let(:admin) { User.create first_name: "Marge", email: "marge@simpson.com", password: "springfield", password_confirmation: "springfield" }
28
+
29
+ before do
30
+ sign_in :user, user
31
+ end
32
+
33
+ after do
34
+ Timecop.return
35
+ end
36
+
37
+ it 'returns 404 if article was not found' do
38
+ post :ping, id: "not-found", resource: 'article'
39
+ expect(response.status).to eql 404
40
+ end
41
+
42
+ it 'updates the user if the time was okay' do
43
+ post :ping, id: article.lady_josephine_server_uuid, resource: 'article'
44
+ json = JSON.parse(response.body)
45
+ expect(response.status).to eql 200
46
+ expect(json["ping"]["state"]).to eq "OK"
47
+ expect(json["ping"]["user_id"]).to eq user.id
48
+ expect(json["ping"]["user_name"]).to eq user.name
49
+ end
50
+
51
+ it 'updates the user if it was forced' do
52
+ Timecop.freeze(Time.local(2014, 10, 10, 1, 0, 15))
53
+ article.lady_josephine_ping_date = Time.local(2014, 10, 10, 1, 0, 0)
54
+ article.lady_josephine_ping_user = admin
55
+ article.save
56
+
57
+ post :ping, id: article.lady_josephine_server_uuid, update: "force", resource: 'article'
58
+
59
+ json = JSON.parse(response.body)
60
+ expect(response.status).to eql 200
61
+ expect(json["ping"]["state"]).to eq "OK"
62
+ expect(json["ping"]["user_id"]).to eq user.id
63
+ expect(json["ping"]["user_name"]).to eq user.name
64
+ end
65
+
66
+ it 'does not update the user if another one edits the content' do
67
+ Timecop.freeze(Time.local(2014, 10, 10, 1, 0, 15))
68
+ article.lady_josephine_ping_date = Time.local(2014, 10, 10, 1, 0, 0)
69
+ article.lady_josephine_ping_user = admin
70
+ article.save
71
+
72
+ post :ping, id: article.lady_josephine_server_uuid, resource: 'article'
73
+
74
+ json = JSON.parse(response.body)
75
+ expect(response.status).to eql 200
76
+ expect(json["ping"]["state"]).to eq "CONFLICT"
77
+ expect(json["ping"]["user_id"]).to eq admin.id
78
+ expect(json["ping"]["user_name"]).to eq admin.name
79
+ end
80
+
81
+ end
82
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe LadyJosephine::ImagesController, type: :controller do
4
+ include Devise::TestHelpers
5
+ routes { LadyJosephine::Engine.routes }
6
+
7
+ let(:article) { Article.create title: "Local man thinks wrestling is real", content_data_hash: { "uuid" => "uuid-uuid-uuid", "version" => "1.0" } }
8
+
9
+ describe '#create' do
10
+
11
+ let(:file) { fixture_file_upload('spec/dummy/app/assets/images/depressed-cat.jpg', 'image/jpeg') }
12
+
13
+ it 'should return an error if the object can´t be saved' do
14
+ expect {
15
+ post :create, attachment: { name: 'file.jpg', file: file}, "block-uuid" => "uuid-uuid-uuid", "article-uuid" => article.lady_josephine_server_uuid, "model-name" => "NotAllowed", "column-name" => "content-data"
16
+ expect(response.status).to eq 500
17
+ }.to change { LadyJosephine::Image.count }.by 0
18
+ end
19
+
20
+ it 'should save an image' do
21
+ expect {
22
+ post :create, attachment: { name: 'file.jpg', file: file}, "block-uuid" => "uuid-uuid-uuid", "article-uuid" => article.lady_josephine_server_uuid, "model-name" => "article", "column-name" => "content-data"
23
+ expect(response.status).to eq 200
24
+ }.to change { LadyJosephine::Image.count }.by 1
25
+ image = LadyJosephine::Image.last
26
+ expect(image.block_uuid).to eq "uuid-uuid-uuid"
27
+ expect(image.file.file.basename).to eq "depressed-cat"
28
+ expect(image.uploadable_type).to eq "Article"
29
+ expect(image.uploadable_id).to eq article.id
30
+ expect(image.uploadable_attribute).to eq "content-data"
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,3 @@
1
+ class Article < ActiveRecord::Base
2
+ include LadyJosephine::Concerns::Model
3
+ end
@@ -0,0 +1,11 @@
1
+ class User < ActiveRecord::Base
2
+ # Include default devise modules. Others available are:
3
+ # :confirmable, :lockable, :timeoutable and :omniauthable
4
+ devise :database_authenticatable, :registerable,
5
+ :recoverable, :rememberable, :trackable, :validatable
6
+
7
+ def name
8
+ self.first_name
9
+ end
10
+
11
+ end
@@ -30,6 +30,7 @@ Rails.application.configure do
30
30
  # The :test delivery method accumulates sent emails in the
31
31
  # ActionMailer::Base.deliveries array.
32
32
  config.action_mailer.delivery_method = :test
33
+ config.action_mailer.default_url_options = { :host => 'http://0.0.0.0:3000' }
33
34
 
34
35
  # Randomize the order test cases are executed.
35
36
  config.active_support.test_order = :random