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 +4 -4
- data/lib/tessa/controller_helpers.rb +16 -0
- data/lib/tessa/rack_upload_proxy.rb +32 -0
- data/lib/tessa/version.rb +1 -1
- data/lib/tessa.rb +2 -0
- data/spec/tessa/controller_helpers_spec.rb +55 -0
- data/spec/tessa/rack_upload_proxy_spec.rb +126 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d4243471a3a0dcf4a53293162987585ea1077e9
|
4
|
+
data.tar.gz: 5124637e6f8064d3389b12e9d56f8c5451de28b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
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.
|
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-
|
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
|