tessa 0.2.0 → 0.3.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.
- 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
|