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 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