fake_dropbox 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -2,35 +2,57 @@ fake_dropbox
2
2
  ============
3
3
 
4
4
  fake_dropbox is a simple fake implementation of the Dropbox API written in Ruby
5
- using the Sinatra framework. It can be used for developing and testing
6
- applications that use Dropbox. There are no real authentication and users (you
7
- are always authenticated), the server stores files on the local machine.
5
+ using the Sinatra framework. It can be used to mock Dropbox when developing and
6
+ testing applications that use Dropbox. There are no real authentication and
7
+ users (you are always authenticated), files are stored on the local machine.
8
8
 
9
9
  Can be used either as a standalone app listening on a port or intercept calls to
10
10
  the real Dropbox in Ruby apps.
11
11
 
12
- It partially implements [version 0](https://www.dropbox.com/developers/reference/oldapi)
13
- of the Dropbox API which should be compatible with [version 1](https://www.dropbox.com/developers/reference/api).
12
+ It implements the following API calls from [Dropbox API version 1][] (some may
13
+ be only partially implemented):
14
+
15
+ * /files (GET)
16
+ * /files_put
17
+ * /files (POST)
18
+ * /metadata
19
+ * /fileops/create_folder
20
+ * /fileops/delete
21
+
22
+ All the calls which are also present in [Dropbox API version 0][] should behave
23
+ as they behave in the official Dropbox API when version is set to 0 (e.g.
24
+ /files (POST) returns `{"result": "winner!"}` instead of file's metadata in
25
+ version 0).
26
+
14
27
  If you find it useful and want to add support for more features, go ahead ;)
15
28
 
29
+ [Dropbox API version 0]: https://www.dropbox.com/developers/reference/oldapi
30
+ [Dropbox API version 1]: https://www.dropbox.com/developers/reference/api
31
+
16
32
 
17
33
  Installation
18
34
  ------------
19
35
 
20
36
  Using RubyGems:
21
37
 
22
- gem install fake_dropbox
38
+ ```
39
+ gem install fake_dropbox
40
+ ```
23
41
 
24
42
  To get the latest development version just clone the repository:
25
43
 
26
- git clone git://github.com/jgonera/fake_dropbox.git
27
- cd fake_dropbox
28
- gem install bundler
29
- bundle install
44
+ ```
45
+ git clone git://github.com/jgonera/fake_dropbox.git
46
+ cd fake_dropbox
47
+ gem install bundler
48
+ bundle install
49
+ ```
30
50
 
31
51
  Then, if you want to install it as a gem:
32
52
 
33
- rake install
53
+ ```
54
+ rake install
55
+ ```
34
56
 
35
57
 
36
58
  How to use
@@ -40,12 +62,21 @@ How to use
40
62
 
41
63
  If you installed fake_dropbox as a gem, you should be able to run:
42
64
 
43
- DROPBOX_DIR=/home/joe/somedir fake_dropbox [PORT]
65
+ ```
66
+ DROPBOX_DIR=/home/joe/somedir fake_dropbox [PORT]
67
+ ```
44
68
 
45
69
  You have to specify an environment variable `DROPBOX_DIR` which will point the
46
70
  server to the directory on which the fake API should operate. Additionally, you
47
71
  can specify a custom port (default is 4321).
48
72
 
73
+ If you cloned the repository and you don't want to install fake_dropbox as a
74
+ gem, you can run it using `rackup` while in the fake_dropbox directory:
75
+
76
+ ```
77
+ DROPBOX_DIR=/home/joe/somedir rackup
78
+ ```
79
+
49
80
  ### Intercepting requests in Ruby apps
50
81
 
51
82
  You can also use this gem to intercept requests to Dropbox in your Ruby app,
@@ -55,12 +86,16 @@ is achieved by using the [WebMock](https://github.com/bblimke/webmock) library.
55
86
  The class responsible for this is `FakeDropbox::Glue`. To intercept requests to
56
87
  the real Dropbox, just instantiate this class in your code:
57
88
 
58
- fake_dropbox = FakeDropbox::Glue.new
89
+ ```ruby
90
+ fake_dropbox = FakeDropbox::Glue.new
91
+ ```
59
92
 
60
93
  You can provide an optional argument to the constructor, pointing to the
61
94
  directory you want to use for your fake Dropbox:
62
95
 
63
- fake_dropbox = FakeDropbox::Glue.new('/home/joe/somedir')
96
+ ```ruby
97
+ fake_dropbox = FakeDropbox::Glue.new('/home/joe/somedir')
98
+ ```
64
99
 
65
100
  If you don't provide it, a temporary directory will be created in the system's
66
101
  temporary path.
@@ -69,29 +104,43 @@ Moreover:
69
104
 
70
105
  * `#dropbox_dir` returns the fake Dropbox directory.
71
106
  * `#empty!` deletes everything in the `dropbox_dir` *recursively*.
72
- Even though it should work only if the `dropbox_dir` resides inside the system's
73
- temporary path, you should use it with caution.
107
+ Even though it should work only if the `dropbox_dir` resides inside the
108
+ system's temporary path, you should use it with caution.
74
109
 
75
110
  A support file for Cucumber tests could look like this:
76
111
 
77
- require 'fake_dropbox'
112
+ ```ruby
113
+ require 'fake_dropbox'
78
114
 
79
- fake_dropbox = FakeDropbox::Glue.new
115
+ fake_dropbox = FakeDropbox::Glue.new
80
116
 
81
- After do
82
- fake_dropbox.empty!
83
- end
117
+ After do
118
+ fake_dropbox.empty!
119
+ end
120
+ ```
84
121
 
85
- ### Using without installing as a gem
122
+ ### Configuration
86
123
 
87
- If you cloned the repository and you don't want to install fake_dropbox as a
88
- gem, you can run it using `rackup` while in the fake_dropbox directory:
124
+ fake_dropbox supports a few configuration options that can be changed after
125
+ initialization. They can be changed in two ways:
126
+
127
+ * by setting `FakeDropbox::Config.<option>` when using inside a Ruby app,
128
+ * by sending a `POST` request to `/__config__` containing options and their
129
+ values as parameters (use `true` and `false` strings as boolean equivalents).
130
+
131
+ The following options are available:
89
132
 
90
- DROPBOX_DIR=/home/joe/somedir rackup
133
+ * `authorize_request_token`, default: `true`
134
+ * `authorize_access_token`, default: `true`
135
+ * `authorized`, default: `true`, when set to `false` all API requests return
136
+ `401 Unauthorized` HTTP status
137
+ * `debug`, default: `DROPBOX_DEBUG` environmental variable or `false`, if set
138
+ to `true` reports all the API requests to STDIO (URL, HTTP headers and body).
91
139
 
92
140
 
93
141
  Copyright
94
142
  ---------
95
143
 
96
- Copyright © 2011 Juliusz Gonera. fake_dropbox is released under the MIT license, see LICENSE for details.
144
+ Copyright © 2011 Juliusz Gonera. fake_dropbox is released under the MIT license,
145
+ see LICENSE for details.
97
146
 
@@ -8,8 +8,13 @@ Gem::Specification.new do |s|
8
8
  s.authors = ["Juliusz Gonera"]
9
9
  s.email = ["jgonera@gmail.com"]
10
10
  s.homepage = "https://github.com/jgonera/fake_dropbox"
11
- s.summary = %q{A simple fake implementation of the Dropbox API}
12
- s.description = %q{Written in Ruby using the Sinatra framework. For development and testing purposes, no real authentication and users, stores files on the local machine. Can be used either as a standalone app listening on a port or intercept calls to the real Dropbox in Ruby apps.}
11
+ s.summary = %q{Mock Dropbox when developing your Dropbox app}
12
+ s.description = %q{
13
+ Fake Dropbox server written using the Sinatra framework. For development
14
+ and testing purposes, no real authentication and users, stores files on the
15
+ local machine. Can be used either as a standalone app listening on a port
16
+ (language agnostic) or intercept calls to the real Dropbox in Ruby apps.
17
+ }
13
18
 
14
19
  s.rubyforge_project = "fake_dropbox"
15
20
  s.extra_rdoc_files = ['README.md', 'LICENSE']
@@ -19,11 +24,11 @@ Gem::Specification.new do |s|
19
24
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
25
  s.require_paths = ["lib"]
21
26
 
22
- s.add_dependency 'sinatra', '~> 1.2.6'
23
- s.add_dependency 'json', '~> 1.6.1'
24
- s.add_dependency 'rack', '~> 1.3.2'
25
- s.add_dependency 'rack-test', '~> 0.6.1'
26
- s.add_dependency 'webmock', '~> 1.7.7'
27
+ s.add_dependency 'sinatra', '>= 1.3.1'
28
+ s.add_dependency 'json', '>= 1.6.1'
29
+ s.add_dependency 'rack', '>= 1.3.2'
30
+ s.add_dependency 'rack-test', '>= 0.6.1'
31
+ s.add_dependency 'webmock', '>= 1.7.7'
27
32
 
28
33
  s.add_development_dependency 'rspec', '~> 2.7.0'
29
34
  end
@@ -0,0 +1,23 @@
1
+ require 'fake_dropbox/utils'
2
+
3
+ module FakeDropbox
4
+ module Config
5
+ class << self
6
+ include FakeDropbox::Utils
7
+
8
+ attr_accessor :authorize_request_token
9
+ attr_accessor :authorize_access_token
10
+ attr_accessor :authorized
11
+ attr_accessor :debug
12
+
13
+ def reset!
14
+ @authorize_request_token = true
15
+ @authorize_access_token = true
16
+ @authorized = true
17
+ @debug = to_bool ENV['DROPBOX_DEBUG']
18
+ end
19
+ end
20
+
21
+ reset!
22
+ end
23
+ end
@@ -2,13 +2,23 @@ require 'sinatra/base'
2
2
  require 'json'
3
3
  require 'fileutils'
4
4
  require 'fake_dropbox/utils'
5
+ require 'fake_dropbox/config'
5
6
 
6
7
  module FakeDropbox
7
8
  class Server < Sinatra::Base
8
9
  before do
9
- if not request.path.start_with?('/__sinatra__')
10
- @dropbox_dir = env['DROPBOX_DIR'] || ENV['DROPBOX_DIR']
10
+ if not request.path.start_with?('/__') # __sinatra__ and __config__
11
+ halt 401 unless FakeDropbox::Config.authorized
12
+ @dropbox_dir = ENV['DROPBOX_DIR']
11
13
  raise 'no DROPBOX_DIR in ENV' if not @dropbox_dir
14
+ if FakeDropbox::Config.debug
15
+ puts "#{request.request_method} #{request.path}"
16
+ request.env.select { |k, v| k.start_with? 'HTTP_' }.each do |k, v|
17
+ puts "#{k}: #{v}"
18
+ end
19
+ puts request.body.read
20
+ request.body.rewind
21
+ end
12
22
  end
13
23
  end
14
24
 
@@ -21,13 +31,22 @@ module FakeDropbox
21
31
  "Unknown URI: #{request.request_method} #{request.path}"
22
32
  end
23
33
  end
34
+
35
+ post '/__config__' do
36
+ params.each do |key, value|
37
+ setter = "#{key}="
38
+ FakeDropbox::Config.send(setter, to_bool(value)) if FakeDropbox::Config.respond_to? setter
39
+ end
40
+ end
24
41
 
25
42
  post '/:version/oauth/request_token' do
26
- 'oauth_token_secret=fake&oauth_token=fake'
43
+ return status 401 unless FakeDropbox::Config.authorize_request_token
44
+ 'oauth_token_secret=request_secret&oauth_token=request_token'
27
45
  end
28
46
 
29
47
  post '/:version/oauth/access_token' do
30
- 'oauth_token_secret=fake&oauth_token=fake'
48
+ return status 401 unless FakeDropbox::Config.authorize_access_token
49
+ 'oauth_token_secret=access_secret&oauth_token=access_token'
31
50
  end
32
51
 
33
52
  post '/:version/files/:mode*' do
@@ -40,8 +59,14 @@ module FakeDropbox
40
59
  FileUtils.cp(tempfile.path, File.join(@dropbox_dir, file_path))
41
60
  File.delete(tempfile.path) if File.exists? tempfile.path
42
61
 
62
+ result = if params[:version] == '0'
63
+ { 'result' => 'winner!' }
64
+ else
65
+ metadata(file_path)
66
+ end
67
+
43
68
  content_type :json
44
- metadata(file_path).to_json
69
+ result.to_json
45
70
  end
46
71
 
47
72
  get '/:version/files/:mode*' do
@@ -50,10 +75,24 @@ module FakeDropbox
50
75
 
51
76
  IO.read(file_path)
52
77
  end
78
+
79
+ put '/:version/files_put/:mode*' do
80
+ file_path = File.join(params[:splat])
81
+ dir = File.join(@dropbox_dir, File.dirname(file_path))
82
+ return status 404 unless File.exists?(dir) and File.directory?(dir)
83
+
84
+ File.open(File.join(@dropbox_dir, file_path), 'w+') do |file|
85
+ file.write(request.body.read)
86
+ end
87
+
88
+ content_type :json
89
+ metadata(file_path).to_json
90
+ end
53
91
 
54
92
  get '/:version/metadata/:mode*' do
93
+ list = params['list'] == 'false' ? false : true
55
94
  content_type :json
56
- metadata(params[:splat][0], params['list'] == 'true').to_json
95
+ metadata(params[:splat][0], list).to_json
57
96
  end
58
97
 
59
98
  post '/:version/fileops/create_folder' do
@@ -77,7 +116,12 @@ module FakeDropbox
77
116
 
78
117
  return status 404 unless File.exists?(entry_path)
79
118
 
119
+ metadata = metadata(entry)
80
120
  FileUtils.remove_entry_secure entry_path
121
+ if params[:version] == '1'
122
+ content_type :json
123
+ metadata.to_json
124
+ end
81
125
  end
82
126
  end
83
127
  end
@@ -36,5 +36,11 @@ module FakeDropbox
36
36
  def safe_path(path)
37
37
  path.gsub(/(\.\.\/|\/\.\.)/, '')
38
38
  end
39
+
40
+ def to_bool(value)
41
+ return true if value == true || value =~ /(true|t|yes|y|1)$/i
42
+ return false if value == false || value.nil? || value =~ /(false|f|no|n|0)$/i
43
+ raise ArgumentError.new("Invalid value for Boolean: \"#{value}\"")
44
+ end
39
45
  end
40
46
  end
@@ -1,3 +1,3 @@
1
1
  module FakeDropbox
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,39 +1,66 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'FakeDropbox::Server' do
4
- before do
4
+ before :each do
5
5
  @tmpdir = Dir.mktmpdir 'fake_dropbox-test'
6
- @env = { 'DROPBOX_DIR' => @tmpdir }
6
+ ENV['DROPBOX_DIR'] = @tmpdir
7
+ FakeDropbox::Config.reset!
7
8
  end
8
9
 
9
- after do
10
+ after :each do
10
11
  FileUtils.remove_entry_secure @tmpdir
11
12
  end
13
+
14
+ it "returns error 401 for any API request if not authorized" do
15
+ post "/__config__", { authorized: false }
16
+ get "/0/files/dropbox/file.ext"
17
+ last_response.status.should == 401
18
+ end
19
+
20
+ it "outputs debug to STDIO when debug set to true" do
21
+ post "/__config__", { debug: true }
22
+ original_stdout = $stdout
23
+ $stdout = StringIO.new
24
+ put "/1/files_put/dropbox/file", "test body"
25
+ $stdout.string.should =~ /^PUT \/1\/files_put\/dropbox\/file\nHTTP.*\ntest body\n$/m
26
+ $stdout = original_stdout
27
+ end
12
28
 
13
29
  describe "POST /<version>/oauth/request_token" do
14
30
  it "returns a fake OAuth request token" do
15
- post "/0/oauth/request_token", {}, @env
16
- #File.open('/home/julas/Desktop/aaa.html', 'w') {|f| f.write(last_response.body) }
31
+ post "/0/oauth/request_token"
17
32
  last_response.should be_ok
18
33
  last_response.body.should include 'oauth_token=', 'oauth_token_secret='
19
34
  end
35
+
36
+ it "returns error 401 when not authorized" do
37
+ post "/__config__", { authorize_request_token: false }
38
+ post "/0/oauth/request_token"
39
+ last_response.status.should == 401
40
+ end
20
41
  end
21
42
 
22
43
  describe "POST /<version>/oauth/access_token" do
23
44
  it "returns a fake OAuth access token" do
24
- post "/0/oauth/access_token", {}, @env
45
+ post "/0/oauth/access_token"
25
46
  last_response.should be_ok
26
47
  last_response.body.should include 'oauth_token=', 'oauth_token_secret='
27
48
  end
49
+
50
+ it "returns error 401 when not authorized" do
51
+ post "/__config__", { authorize_access_token: false }
52
+ post "/0/oauth/access_token"
53
+ last_response.status.should == 401
54
+ end
28
55
  end
29
56
 
30
57
  describe "POST /<version>/files/dropbox/<path>" do
31
58
  let(:uploaded_file) { Rack::Test::UploadedFile.new(fixture_path('dummy.txt')) }
32
59
  let(:params) { { file: uploaded_file } }
33
60
 
34
- shared_examples_for "correct upload" do
61
+ shared_examples_for "correct POST upload" do
35
62
  it "saves the file in the directory" do
36
- post "/0/files/dropbox" + path, params, @env
63
+ post "/0/files/dropbox" + path, params
37
64
  Dir.entries(dir).should include 'dummy.txt'
38
65
  original_content = File.new(fixture_path('dummy.txt')).read
39
66
  uploaded_content = File.new(File.join(dir, 'dummy.txt')).read
@@ -41,13 +68,20 @@ describe 'FakeDropbox::Server' do
41
68
  end
42
69
 
43
70
  it "deletes the temporary file (RackMultipart*)" do
44
- post "/0/files/dropbox" + path, params, @env
71
+ post "/0/files/dropbox" + path, params
45
72
  tempfile = last_request.params['file'][:tempfile]
46
73
  File.exists?(tempfile.path).should == false
47
74
  end
48
75
 
49
- it "returns file metadata" do
50
- post "/0/files/dropbox" + path, params, @env
76
+ it "returns success message for version 0" do
77
+ post "/0/files/dropbox" + path, params
78
+ last_response.should be_ok
79
+ response = JSON.parse(last_response.body)
80
+ response.should == { 'result' => 'winner!' }
81
+ end
82
+
83
+ it "returns file metadata for version 1" do
84
+ post "/1/files/dropbox" + path, params
51
85
  last_response.should be_ok
52
86
  metadata = JSON.parse(last_response.body)
53
87
  metadata['path'].should == path + '/dummy.txt'
@@ -59,7 +93,7 @@ describe 'FakeDropbox::Server' do
59
93
  let (:path) { '' }
60
94
  let (:dir) { @tmpdir }
61
95
 
62
- it_behaves_like "correct upload"
96
+ it_behaves_like "correct POST upload"
63
97
  end
64
98
 
65
99
  context "when the path is not root" do
@@ -68,12 +102,57 @@ describe 'FakeDropbox::Server' do
68
102
  let (:dir) { File.join(@tmpdir, path) }
69
103
  before { Dir.mkdir(dir) }
70
104
 
71
- it_behaves_like "correct upload"
105
+ it_behaves_like "correct POST upload"
106
+ end
107
+
108
+ context "when the path does not exist" do
109
+ it "returns error 404" do
110
+ post "/0/files/dropbox/incorrect", params
111
+ last_response.status.should == 404
112
+ end
113
+ end
114
+ end
115
+ end
116
+
117
+ describe "PUT /<version>/files_put/dropbox/<path>" do
118
+ let(:body) { IO.read(fixture_path('dummy.txt')) }
119
+
120
+ shared_examples_for "correct PUT upload" do
121
+ it "saves the file in the directory" do
122
+ put "/1/files_put/dropbox" + path, body
123
+ Dir.entries(dir).should include 'dummy.txt'
124
+ uploaded_content = IO.read(File.join(dir, 'dummy.txt'))
125
+ uploaded_content.should == body
126
+ end
127
+
128
+ it "returns file metadata" do
129
+ put "/1/files_put/dropbox" + path, body
130
+ last_response.should be_ok
131
+ metadata = JSON.parse(last_response.body)
132
+ metadata['path'].should == path
133
+ metadata['modified'].should include Time.new.strftime('%a, %d %b %Y %H:%M')
134
+ end
135
+ end
136
+
137
+ context "when the path is root" do
138
+ let (:path) { '/dummy.txt' }
139
+ let (:dir) { @tmpdir }
140
+
141
+ it_behaves_like "correct PUT upload"
142
+ end
143
+
144
+ context "when the path is not root" do
145
+ context "when the path exists" do
146
+ let (:path) { '/somedir/dummy.txt' }
147
+ let (:dir) { File.join(@tmpdir, '/somedir') }
148
+ before { Dir.mkdir(dir) }
149
+
150
+ it_behaves_like "correct PUT upload"
72
151
  end
73
152
 
74
153
  context "when the path does not exist" do
75
154
  it "returns error 404" do
76
- post "/0/files/dropbox/incorrect", params, @env
155
+ put "/1/files_put/dropbox/incorrect/dummy.txt", body
77
156
  last_response.status.should == 404
78
157
  end
79
158
  end
@@ -89,7 +168,7 @@ describe 'FakeDropbox::Server' do
89
168
  end
90
169
 
91
170
  it "returns file contents" do
92
- get "/0/files/dropbox/file.ext", {}, @env
171
+ get "/0/files/dropbox/file.ext"
93
172
  last_response.should be_ok
94
173
  last_response.body.should == "This is a test."
95
174
  end
@@ -97,7 +176,7 @@ describe 'FakeDropbox::Server' do
97
176
 
98
177
  context "when the file does not exist" do
99
178
  it "returns error 404" do
100
- get "/0/files/dropbox/none.ext", {}, @env
179
+ get "/0/files/dropbox/none.ext"
101
180
  last_response.status.should == 404
102
181
  end
103
182
  end
@@ -106,7 +185,7 @@ describe 'FakeDropbox::Server' do
106
185
  describe "GET /<version>/metadata/dropbox/<path>" do
107
186
  it "returns metadata" do
108
187
  File.open(File.join(@tmpdir, 'file.ext'), 'w')
109
- get "/0/metadata/dropbox/file.ext", {}, @env
188
+ get "/0/metadata/dropbox/file.ext", { list: 'false' }
110
189
  last_response.should be_ok
111
190
  metadata = JSON.parse(last_response.body)
112
191
  metadata['path'].should == '/file.ext'
@@ -116,7 +195,7 @@ describe 'FakeDropbox::Server' do
116
195
  context "when the path is a directory and want a list" do
117
196
  it "returns its children metadata too" do
118
197
  FileUtils.cp(fixture_path('dummy.txt'), @tmpdir)
119
- get "/0/metadata/dropbox", {list: 'true'}, @env
198
+ get "/0/metadata/dropbox"
120
199
  metadata = JSON.parse(last_response.body)
121
200
  metadata.should include 'contents'
122
201
  end
@@ -128,13 +207,13 @@ describe 'FakeDropbox::Server' do
128
207
  let(:params) { { path: path, root: 'dropbox' } }
129
208
 
130
209
  it "creates a folder" do
131
- post "/0/fileops/create_folder", params, @env
210
+ post "/0/fileops/create_folder", params
132
211
  File.exists?(File.join(@tmpdir, path)).should == true
133
212
  File.directory?(File.join(@tmpdir, path)).should == true
134
213
  end
135
214
 
136
215
  it "returns folder's metadata" do
137
- metadata = post "/0/fileops/create_folder", params, @env
216
+ metadata = post "/0/fileops/create_folder", params
138
217
  last_response.should be_ok
139
218
  metadata = JSON.parse(last_response.body)
140
219
  metadata['path'].should == path
@@ -157,7 +236,7 @@ describe 'FakeDropbox::Server' do
157
236
  let(:params) { { path: '/somedir', root: 'wrong' } }
158
237
 
159
238
  it "returns error 400" do
160
- post "/0/fileops/create_folder", params, @env
239
+ post "/0/fileops/create_folder", params
161
240
  last_response.status.should == 400
162
241
  end
163
242
  end
@@ -167,7 +246,7 @@ describe 'FakeDropbox::Server' do
167
246
  # let(:params) { { path: '/nonexistant/somedir', root: 'dropbox' } }
168
247
  #
169
248
  # it "returns error 404" do
170
- # post "/0/fileops/create_folder", params, @env
249
+ # post "/0/fileops/create_folder", params
171
250
  # last_response.status.should == 404
172
251
  # end
173
252
  # end
@@ -177,7 +256,7 @@ describe 'FakeDropbox::Server' do
177
256
  before { Dir.mkdir(File.join(@tmpdir, 'somedir')) }
178
257
 
179
258
  it "returns error 403" do
180
- post "/0/fileops/create_folder", params, @env
259
+ post "/0/fileops/create_folder", params
181
260
  last_response.status.should == 403
182
261
  end
183
262
  end
@@ -190,10 +269,21 @@ describe 'FakeDropbox::Server' do
190
269
 
191
270
  shared_examples_for "deleting entry" do
192
271
  it "removes the entry" do
193
- post '/0/fileops/delete', params, @env
272
+ post '/0/fileops/delete', params
194
273
  last_response.should be_ok
195
274
  File.exists?(abs_path).should == false
196
275
  end
276
+
277
+ it "returns entry's metadata for version 0" do
278
+ post '/0/fileops/delete', params
279
+ last_response.body.should be_empty
280
+ end
281
+
282
+ it "returns entry's metadata for version 1" do
283
+ post '/1/fileops/delete', params
284
+ metadata = JSON.parse(last_response.body)
285
+ metadata['path'].should == params[:path]
286
+ end
197
287
  end
198
288
 
199
289
  context "when it's a non-empty directory" do
@@ -221,7 +311,7 @@ describe 'FakeDropbox::Server' do
221
311
  let(:params) { { path: '/nonexistant.ext', root: 'dropbox' } }
222
312
 
223
313
  it "returns error 404" do
224
- post '/0/fileops/delete', params, @env
314
+ post '/0/fileops/delete', params
225
315
  last_response.status.should == 404
226
316
  end
227
317
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fake_dropbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,67 +9,66 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-27 00:00:00.000000000 +02:00
13
- default_executable:
12
+ date: 2012-08-11 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: sinatra
17
- requirement: &16756060 !ruby/object:Gem::Requirement
16
+ requirement: &11405320 !ruby/object:Gem::Requirement
18
17
  none: false
19
18
  requirements:
20
- - - ~>
19
+ - - ! '>='
21
20
  - !ruby/object:Gem::Version
22
- version: 1.2.6
21
+ version: 1.3.1
23
22
  type: :runtime
24
23
  prerelease: false
25
- version_requirements: *16756060
24
+ version_requirements: *11405320
26
25
  - !ruby/object:Gem::Dependency
27
26
  name: json
28
- requirement: &16787980 !ruby/object:Gem::Requirement
27
+ requirement: &11404220 !ruby/object:Gem::Requirement
29
28
  none: false
30
29
  requirements:
31
- - - ~>
30
+ - - ! '>='
32
31
  - !ruby/object:Gem::Version
33
32
  version: 1.6.1
34
33
  type: :runtime
35
34
  prerelease: false
36
- version_requirements: *16787980
35
+ version_requirements: *11404220
37
36
  - !ruby/object:Gem::Dependency
38
37
  name: rack
39
- requirement: &16787520 !ruby/object:Gem::Requirement
38
+ requirement: &11402740 !ruby/object:Gem::Requirement
40
39
  none: false
41
40
  requirements:
42
- - - ~>
41
+ - - ! '>='
43
42
  - !ruby/object:Gem::Version
44
43
  version: 1.3.2
45
44
  type: :runtime
46
45
  prerelease: false
47
- version_requirements: *16787520
46
+ version_requirements: *11402740
48
47
  - !ruby/object:Gem::Dependency
49
48
  name: rack-test
50
- requirement: &16787060 !ruby/object:Gem::Requirement
49
+ requirement: &11401960 !ruby/object:Gem::Requirement
51
50
  none: false
52
51
  requirements:
53
- - - ~>
52
+ - - ! '>='
54
53
  - !ruby/object:Gem::Version
55
54
  version: 0.6.1
56
55
  type: :runtime
57
56
  prerelease: false
58
- version_requirements: *16787060
57
+ version_requirements: *11401960
59
58
  - !ruby/object:Gem::Dependency
60
59
  name: webmock
61
- requirement: &16786600 !ruby/object:Gem::Requirement
60
+ requirement: &11401360 !ruby/object:Gem::Requirement
62
61
  none: false
63
62
  requirements:
64
- - - ~>
63
+ - - ! '>='
65
64
  - !ruby/object:Gem::Version
66
65
  version: 1.7.7
67
66
  type: :runtime
68
67
  prerelease: false
69
- version_requirements: *16786600
68
+ version_requirements: *11401360
70
69
  - !ruby/object:Gem::Dependency
71
70
  name: rspec
72
- requirement: &16786140 !ruby/object:Gem::Requirement
71
+ requirement: &11793560 !ruby/object:Gem::Requirement
73
72
  none: false
74
73
  requirements:
75
74
  - - ~>
@@ -77,11 +76,12 @@ dependencies:
77
76
  version: 2.7.0
78
77
  type: :development
79
78
  prerelease: false
80
- version_requirements: *16786140
81
- description: Written in Ruby using the Sinatra framework. For development and testing
82
- purposes, no real authentication and users, stores files on the local machine. Can
83
- be used either as a standalone app listening on a port or intercept calls to the
84
- real Dropbox in Ruby apps.
79
+ version_requirements: *11793560
80
+ description: ! "\n Fake Dropbox server written using the Sinatra framework. For
81
+ development\n and testing purposes, no real authentication and users, stores
82
+ files on the\n local machine. Can be used either as a standalone app listening
83
+ on a port\n (language agnostic) or intercept calls to the real Dropbox in Ruby
84
+ apps.\n "
85
85
  email:
86
86
  - jgonera@gmail.com
87
87
  executables:
@@ -101,6 +101,7 @@ files:
101
101
  - config.ru
102
102
  - fake_dropbox.gemspec
103
103
  - lib/fake_dropbox.rb
104
+ - lib/fake_dropbox/config.rb
104
105
  - lib/fake_dropbox/glue.rb
105
106
  - lib/fake_dropbox/server.rb
106
107
  - lib/fake_dropbox/utils.rb
@@ -110,7 +111,6 @@ files:
110
111
  - spec/server_spec.rb
111
112
  - spec/spec_helper.rb
112
113
  - spec/utils_spec.rb
113
- has_rdoc: true
114
114
  homepage: https://github.com/jgonera/fake_dropbox
115
115
  licenses: []
116
116
  post_install_message:
@@ -131,8 +131,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
131
  version: '0'
132
132
  requirements: []
133
133
  rubyforge_project: fake_dropbox
134
- rubygems_version: 1.6.2
134
+ rubygems_version: 1.8.15
135
135
  signing_key:
136
136
  specification_version: 3
137
- summary: A simple fake implementation of the Dropbox API
137
+ summary: Mock Dropbox when developing your Dropbox app
138
138
  test_files: []