tessa 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a4842f3250777ed9f020f3096a04782f1e740a7d
4
- data.tar.gz: a1984882ebc543a5a0acf098f54b4c081f61b8b0
3
+ metadata.gz: 7d4243471a3a0dcf4a53293162987585ea1077e9
4
+ data.tar.gz: 5124637e6f8064d3389b12e9d56f8c5451de28b2
5
5
  SHA512:
6
- metadata.gz: ed5894431e9139b5440edb4d5cf30ad8c2f4364771953215a4e60089076e615b910be1bbb43616b35f9fa0a62e1b7b3dba893d06f4623dd59bcf6715e0da0db0
7
- data.tar.gz: 5c1d7e34c98f0bc52a7bc01354217be0669346d97eeb1f2a71c2dcd5eb37aaecd9ab320d7f13e513dbba370960e65e23bb2062ea5c735823f12b751b012b9824
6
+ metadata.gz: accbf3e68da83af76335f1b1f64368b3a579141c3e7657cff1a49d2b0418ac90ee422f246f8e18dd7f8584f27e1b0afe7ff1479ab0f3067cb42a92f984b940a2
7
+ data.tar.gz: a2a7691c6dc45057a2acbcd8996c7ce56b53ea7cc6dbc710be51dfc59ab9197140cea91caaf0792a37f69bb25f8f51a14a5d39ad16421cf7279cbda6a3bdf5f7
@@ -0,0 +1,16 @@
1
+ module Tessa
2
+ module ControllerHelpers
3
+
4
+ def params_for_asset(changes)
5
+ Tessa::AssetChangeSet.new(
6
+ changes: changes,
7
+ scoped_ids: tessa_upload_asset_ids,
8
+ )
9
+ end
10
+
11
+ def tessa_upload_asset_ids
12
+ session[:tessa_upload_asset_ids] ||= []
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,32 @@
1
+ module Tessa
2
+ class RackUploadProxy
3
+
4
+ def call(env)
5
+ params = env['rack.request.form_hash']
6
+ upload = Tessa::Upload.create(
7
+ name: params["name"],
8
+ size: params["size"],
9
+ mime_type: params["mime_type"],
10
+ )
11
+
12
+ env['rack.session'][:tessa_upload_asset_ids] ||= []
13
+ env['rack.session'][:tessa_upload_asset_ids] << upload.asset_id
14
+
15
+ response = {
16
+ asset_id: upload.asset_id,
17
+ upload_url: upload.upload_url,
18
+ upload_method: upload.upload_method,
19
+ }
20
+
21
+ [200, {"Content-Type" => "application/json"}, [response.to_json]]
22
+ rescue Tessa::RequestFailed
23
+ [500, {"Content-Type" => "application/json"}, [{ "error" => "Failed to retreive upload URL" }.to_json]]
24
+ end
25
+
26
+ def self.call(*args)
27
+ new.call(*args)
28
+ end
29
+
30
+ end
31
+ end
32
+
data/lib/tessa/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tessa
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/tessa.rb CHANGED
@@ -10,7 +10,9 @@ require "tessa/response_factory"
10
10
  require "tessa/asset"
11
11
  require "tessa/asset_change"
12
12
  require "tessa/asset_change_set"
13
+ require "tessa/controller_helpers"
13
14
  require "tessa/model"
15
+ require "tessa/rack_upload_proxy"
14
16
  require "tessa/upload"
15
17
 
16
18
 
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Tessa::ControllerHelpers do
4
+ let(:controller) {
5
+ Class.new do
6
+ attr_writer :session
7
+
8
+ def session
9
+ @session ||= {}
10
+ end
11
+
12
+ end.tap { |c| c.send :include, described_class }
13
+ }
14
+ subject(:instance) { controller.new }
15
+
16
+ describe "#tessa_upload_asset_ids" do
17
+ it "returns the value of session[:tessa_upload_asset_ids]" do
18
+ instance.session = { tessa_upload_asset_ids: :value }
19
+ expect(instance.tessa_upload_asset_ids).to eq(:value)
20
+ end
21
+
22
+ it "sets and returns session[:tessa_upload_asset_ids] to an empty array if nil" do
23
+ array = instance.tessa_upload_asset_ids
24
+ expect(array).to eq([])
25
+ array << 123
26
+ expect(instance.tessa_upload_asset_ids).to eq(array)
27
+ end
28
+ end
29
+
30
+ describe "#params_for_asset" do
31
+ it "returns a Tessa::AssetChangeSet" do
32
+ expect(instance.params_for_asset({})).to be_a(Tessa::AssetChangeSet)
33
+ end
34
+
35
+ it "sets the value of changes to the argument passed" do
36
+ changes = [Tessa::AssetChange.new(id: 1)]
37
+ expect(instance.params_for_asset(changes).changes).to eq(changes)
38
+ end
39
+
40
+ it "sets the scoped_ids to the value of tessa_upload_asset_ids" do
41
+ scoped_ids = [1, 2, 3]
42
+ instance.session[:tessa_upload_asset_ids] = scoped_ids
43
+ expect(instance.params_for_asset([]).scoped_ids).to eq(scoped_ids)
44
+ end
45
+
46
+ it "ensures a unique array" do
47
+ scoped_ids = [1]
48
+ instance.session[:tessa_upload_asset_ids] = scoped_ids
49
+ set = instance.params_for_asset([])
50
+ set.scoped_ids << 2
51
+ expect(scoped_ids).to eq([1])
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,126 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Tessa::RackUploadProxy do
4
+ Result = Struct.new(:status, :headers, :body) do
5
+ def json
6
+ JSON.parse body.first
7
+ end
8
+ end
9
+
10
+ subject(:result) { Result.new *described_class.call(env) }
11
+ let(:env) {
12
+ {
13
+ "rack.request.form_hash" => params,
14
+ "rack.session" => session,
15
+ }
16
+ }
17
+ let(:params) { {} }
18
+ let(:session) { {} }
19
+ let(:upload) {
20
+ Tessa::Upload.new(
21
+ asset_id: 123,
22
+ upload_url: "a-url",
23
+ upload_method: "a-method",
24
+ )
25
+ }
26
+ before do
27
+ allow(Tessa::Upload).to receive(:create).and_return(upload)
28
+ end
29
+
30
+ shared_examples_for "proper json return" do
31
+ it "returns asset_id" do
32
+ expect(result.json['asset_id']).to eq(123)
33
+ end
34
+
35
+ it "returns upload_url" do
36
+ expect(result.json['upload_url']).to eq("a-url")
37
+ end
38
+
39
+ it "returns upload_method" do
40
+ expect(result.json['upload_method']).to eq("a-method")
41
+ end
42
+
43
+ it "returns a 200 response" do
44
+ expect(result.status).to eq(200)
45
+ end
46
+
47
+ it "sets the mime type to application/json" do
48
+ expect(result.headers).to include("Content-Type" => "application/json")
49
+ end
50
+
51
+ context "when Tessa::Upload.create raises RequestFailed" do
52
+ before do
53
+ allow(Tessa::Upload).to receive(:create).and_raise(Tessa::RequestFailed)
54
+ end
55
+
56
+ it "returns a proper 500" do
57
+ expect(result.status).to eq(500)
58
+ end
59
+
60
+ it "sets the mime type to application/json" do
61
+ expect(result.headers).to include("Content-Type" => "application/json")
62
+ end
63
+
64
+ it "includes an error message in JSON response" do
65
+ expect(result.json['error']).to be_truthy
66
+ end
67
+ end
68
+ end
69
+
70
+ context "with no params and no session" do
71
+ it "calls Tessa::Upload.create" do
72
+ expect(Tessa::Upload).to receive(:create).and_return(upload)
73
+ result
74
+ end
75
+
76
+ it "pushes the asset_id onto session" do
77
+ result
78
+ expect(session[:tessa_upload_asset_ids]).to eq([123])
79
+ end
80
+
81
+ it_behaves_like "proper json return"
82
+ end
83
+
84
+ context "with params" do
85
+ let(:params) {
86
+ {
87
+ "name" => "my-name",
88
+ "size" => 456,
89
+ "mime_type" => "plain/text",
90
+ }
91
+ }
92
+
93
+ it "calls Tessa::Upload.create with 'name'" do
94
+ expect(Tessa::Upload).to receive(:create).with(hash_including(name: "my-name"))
95
+ result
96
+ end
97
+
98
+ it "calls Tessa::Upload.create with 'size'" do
99
+ expect(Tessa::Upload).to receive(:create).with(hash_including(size: 456))
100
+ result
101
+ end
102
+
103
+ it "calls Tessa::Upload.create with 'mime_type'" do
104
+ expect(Tessa::Upload).to receive(:create).with(hash_including(mime_type: "plain/text"))
105
+ result
106
+ end
107
+
108
+ it_behaves_like "proper json return"
109
+ end
110
+
111
+ context "with existing session" do
112
+ let(:session) {
113
+ {
114
+ tessa_upload_asset_ids: [:existing_id],
115
+ }
116
+ }
117
+
118
+ it "does not remove existing ids" do
119
+ result
120
+ expect(session[:tessa_upload_asset_ids]).to eq([:existing_id, 123])
121
+ end
122
+
123
+ it_behaves_like "proper json return"
124
+ end
125
+
126
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tessa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Powell
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-03-19 00:00:00.000000000 Z
12
+ date: 2015-03-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
@@ -116,8 +116,10 @@ files:
116
116
  - lib/tessa/asset_change.rb
117
117
  - lib/tessa/asset_change_set.rb
118
118
  - lib/tessa/config.rb
119
+ - lib/tessa/controller_helpers.rb
119
120
  - lib/tessa/model.rb
120
121
  - lib/tessa/model/field.rb
122
+ - lib/tessa/rack_upload_proxy.rb
121
123
  - lib/tessa/response_factory.rb
122
124
  - lib/tessa/upload.rb
123
125
  - lib/tessa/version.rb
@@ -127,8 +129,10 @@ files:
127
129
  - spec/tessa/asset_change_spec.rb
128
130
  - spec/tessa/asset_spec.rb
129
131
  - spec/tessa/config_spec.rb
132
+ - spec/tessa/controller_helpers_spec.rb
130
133
  - spec/tessa/model_field_spec.rb
131
134
  - spec/tessa/model_spec.rb
135
+ - spec/tessa/rack_upload_proxy_spec.rb
132
136
  - spec/tessa/upload_spec.rb
133
137
  - tessa.gemspec
134
138
  homepage: https://github.com/watermarkchurch/tessa
@@ -162,6 +166,8 @@ test_files:
162
166
  - spec/tessa/asset_change_spec.rb
163
167
  - spec/tessa/asset_spec.rb
164
168
  - spec/tessa/config_spec.rb
169
+ - spec/tessa/controller_helpers_spec.rb
165
170
  - spec/tessa/model_field_spec.rb
166
171
  - spec/tessa/model_spec.rb
172
+ - spec/tessa/rack_upload_proxy_spec.rb
167
173
  - spec/tessa/upload_spec.rb