genghisapp 2.1.6 → 2.2.0.beta.1
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.
- data/CHANGELOG.markdown +104 -30
- data/README.markdown +15 -19
- data/genghis.rb +223 -45
- data/spec/requests/api_spec.rb +194 -0
- data/spec/spec_helper.rb +4 -0
- metadata +3 -3
data/spec/requests/api_spec.rb
CHANGED
@@ -525,6 +525,16 @@ genghis_backends.each do |backend|
|
|
525
525
|
res.status.should eq 400
|
526
526
|
end
|
527
527
|
|
528
|
+
it 'returns 400 if the document id is invalid' do
|
529
|
+
res = @api.post do |req|
|
530
|
+
req.url '/servers/localhost/databases/__genghis_spec_test__/collections/spec_docs/documents'
|
531
|
+
req.headers['Content-Type'] = 'application/json'
|
532
|
+
req.body = {_id: [0, 1]}.to_json
|
533
|
+
end
|
534
|
+
|
535
|
+
res.status.should eq 400
|
536
|
+
end
|
537
|
+
|
528
538
|
it 'returns 404 if the collection is not found' do
|
529
539
|
res = @api.post do |req|
|
530
540
|
req.url '/servers/localhost/databases/__genghis_spec_test__/collections/fake_docs/documents'
|
@@ -588,6 +598,17 @@ genghis_backends.each do |backend|
|
|
588
598
|
test: 2
|
589
599
|
end
|
590
600
|
|
601
|
+
it 'returns 400 if a document id is updated' do
|
602
|
+
id = @coll.insert({test: 1})
|
603
|
+
res = @api.put do |req|
|
604
|
+
req.url '/servers/localhost/databases/__genghis_spec_test__/collections/spec_docs/documents/' + id.to_s
|
605
|
+
req.headers['Content-Type'] = 'application/json'
|
606
|
+
req.body = { _id: 1, test: 2 }.to_json
|
607
|
+
end
|
608
|
+
|
609
|
+
res.status.should eq 400
|
610
|
+
end
|
611
|
+
|
591
612
|
it 'returns 400 if the document is invalid' do
|
592
613
|
id = @coll.insert({test: 1})
|
593
614
|
res = @api.put do |req|
|
@@ -660,6 +681,179 @@ genghis_backends.each do |backend|
|
|
660
681
|
@coll.find(_id: id).count.should eq 1
|
661
682
|
end
|
662
683
|
end
|
684
|
+
|
685
|
+
context 'GridFS' do
|
686
|
+
before :all do
|
687
|
+
@grid = Mongo::Grid.new(@coll.db, 'test')
|
688
|
+
@grid.put('tmp')
|
689
|
+
end
|
690
|
+
|
691
|
+
describe 'POST /servers/:server/databases/:db/collections/:coll/files' do
|
692
|
+
it 'inserts a new file' do
|
693
|
+
res = @api.post do |req|
|
694
|
+
req.url '/servers/localhost/databases/__genghis_spec_test__/collections/test.files/files'
|
695
|
+
req.headers['Content-Type'] = 'application/json'
|
696
|
+
req.body = {
|
697
|
+
file: encode_upload('foo!'),
|
698
|
+
filename: 'foo.txt',
|
699
|
+
contentType: 'application/octet',
|
700
|
+
metadata: {expected: 'you know it'}
|
701
|
+
}.to_json
|
702
|
+
end
|
703
|
+
|
704
|
+
res.status.should eq 200
|
705
|
+
res.body.should match_json_expression \
|
706
|
+
_id: Hash,
|
707
|
+
filename: 'foo.txt',
|
708
|
+
contentType: 'application/octet',
|
709
|
+
metadata: { expected: 'you know it' },
|
710
|
+
uploadDate: Hash,
|
711
|
+
length: Fixnum,
|
712
|
+
chunkSize: Fixnum,
|
713
|
+
md5: String
|
714
|
+
end
|
715
|
+
|
716
|
+
it 'returns 400 if the file upload is not a base64 encoded data: URI' do
|
717
|
+
res = @api.post do |req|
|
718
|
+
req.url '/servers/localhost/databases/__genghis_spec_test__/collections/test.files/files'
|
719
|
+
req.headers['Content-Type'] = 'application/json'
|
720
|
+
req.body = {
|
721
|
+
file: 'foo!',
|
722
|
+
filename: 'foo.txt',
|
723
|
+
contentType: 'application/octet',
|
724
|
+
metadata: {expected: 'you know it'}
|
725
|
+
}.to_json
|
726
|
+
end
|
727
|
+
|
728
|
+
res.status.should eq 400
|
729
|
+
res.body.should match_json_expression \
|
730
|
+
error: 'File must be a base64 encoded data: URI',
|
731
|
+
status: 400
|
732
|
+
end
|
733
|
+
|
734
|
+
it 'returns 400 if the document is missing important bits' do
|
735
|
+
res = @api.post do |req|
|
736
|
+
req.url '/servers/localhost/databases/__genghis_spec_test__/collections/test.files/files'
|
737
|
+
req.headers['Content-Type'] = 'application/json'
|
738
|
+
req.body = {filename: 'foo.txt'}.to_json
|
739
|
+
end
|
740
|
+
res.status.should eq 400
|
741
|
+
end
|
742
|
+
|
743
|
+
it 'returns 400 if the document has unexpected properties' do
|
744
|
+
res = @api.post do |req|
|
745
|
+
req.url '/servers/localhost/databases/__genghis_spec_test__/collections/test.files/files'
|
746
|
+
req.headers['Content-Type'] = 'application/json'
|
747
|
+
req.body = {file: encode_upload('foo'), unexpected: 'you know it.'}.to_json
|
748
|
+
end
|
749
|
+
res.status.should eq 400
|
750
|
+
end
|
751
|
+
|
752
|
+
it 'returns 404 if the collection is not found' do
|
753
|
+
res = @api.post do |req|
|
754
|
+
req.url '/servers/localhost/databases/__genghis_spec_test__/collections/fake.files/files'
|
755
|
+
req.headers['Content-Type'] = 'application/json'
|
756
|
+
req.body = {file: encode_upload('foo')}.to_json
|
757
|
+
end
|
758
|
+
res.status.should eq 404
|
759
|
+
end
|
760
|
+
|
761
|
+
it 'returns 404 if the collection is not a GridFS files collection' do
|
762
|
+
res = @api.post do |req|
|
763
|
+
req.url '/servers/localhost/databases/__genghis_spec_test__/collections/test.chunks/files'
|
764
|
+
req.headers['Content-Type'] = 'application/json'
|
765
|
+
req.body = {file: encode_upload('foo')}.to_json
|
766
|
+
end
|
767
|
+
res.status.should eq 404
|
768
|
+
end
|
769
|
+
|
770
|
+
it 'returns 404 if the database is not found' do
|
771
|
+
res = @api.post do |req|
|
772
|
+
req.url '/servers/localhost/databases/__genghis_spec_fake_db__/collections/test.files/files'
|
773
|
+
req.headers['Content-Type'] = 'application/json'
|
774
|
+
req.body = {file: 'foo'}.to_json
|
775
|
+
end
|
776
|
+
res.status.should eq 404
|
777
|
+
end
|
778
|
+
end
|
779
|
+
|
780
|
+
describe 'GET /servers/:server/databases/:db/collections/:coll/files/:id' do
|
781
|
+
it 'returns a document' do
|
782
|
+
id = @grid.put('foo')
|
783
|
+
res = @api.get do |req|
|
784
|
+
req.url '/servers/localhost/databases/__genghis_spec_test__/collections/test.files/files/' + id.to_s
|
785
|
+
req.headers.delete('X-Requested-With')
|
786
|
+
req.headers.delete('Accept')
|
787
|
+
end
|
788
|
+
|
789
|
+
res.status.should eq 200
|
790
|
+
res.headers['Content-Disposition'].should start_with 'attachment'
|
791
|
+
res.body.should eq 'foo'
|
792
|
+
end
|
793
|
+
|
794
|
+
it 'returns 404 if the document is not found' do
|
795
|
+
res = @api.get '/servers/localhost/databases/__genghis_spec_test__/collections/test.files/files/123'
|
796
|
+
res.status.should eq 404
|
797
|
+
end
|
798
|
+
|
799
|
+
it 'returns 404 if the collection is not found' do
|
800
|
+
id = @grid.put('bar')
|
801
|
+
res = @api.get '/servers/localhost/databases/__genghis_spec_test__/collections/fake.files/files/' + id.to_s
|
802
|
+
res.status.should eq 404
|
803
|
+
end
|
804
|
+
|
805
|
+
it 'returns 404 if the collection is not a GridFS files collection' do
|
806
|
+
id = @grid.put('baz')
|
807
|
+
res = @api.get '/servers/localhost/databases/__genghis_spec_test__/collections/test.chunks/files/' + id.to_s
|
808
|
+
res.status.should eq 404
|
809
|
+
end
|
810
|
+
|
811
|
+
it 'returns 404 if the database is not found' do
|
812
|
+
id = @grid.put('qux')
|
813
|
+
res = @api.get '/servers/localhost/databases/__genghis_spec_fake_db__/collections/test.files/files/' + id.to_s
|
814
|
+
res.status.should eq 404
|
815
|
+
end
|
816
|
+
end
|
817
|
+
|
818
|
+
describe 'DELETE /servers/:server/databases/:db/collections/:coll/files/:id' do
|
819
|
+
it 'deletes a file (and all chunks)' do
|
820
|
+
id = @grid.put('wheee')
|
821
|
+
res = @api.delete '/servers/localhost/databases/__genghis_spec_test__/collections/test.files/files/' + id.to_s
|
822
|
+
|
823
|
+
res.status.should eq 200
|
824
|
+
res.body.should match_json_expression \
|
825
|
+
success: true
|
826
|
+
|
827
|
+
expect { @grid.get(id) }.to raise_error Mongo::GridFileNotFound
|
828
|
+
|
829
|
+
# and the chunks should be gone...
|
830
|
+
@db['test.chunks'].find(_id: id).count.should eq 0
|
831
|
+
end
|
832
|
+
|
833
|
+
it 'returns 404 if the document is not found' do
|
834
|
+
res = @api.delete '/servers/localhost/databases/__genghis_spec_test__/collections/test.files/files/123'
|
835
|
+
res.status.should eq 404
|
836
|
+
end
|
837
|
+
|
838
|
+
it 'returns 404 if the collection is not found' do
|
839
|
+
id = @grid.put('bar')
|
840
|
+
res = @api.delete '/servers/localhost/databases/__genghis_spec_test__/collections/fake.files/files/' + id.to_s
|
841
|
+
res.status.should eq 404
|
842
|
+
end
|
843
|
+
|
844
|
+
it 'returns 404 if the collection is not a GridFS files collection' do
|
845
|
+
id = @grid.put('baz')
|
846
|
+
res = @api.delete '/servers/localhost/databases/__genghis_spec_test__/collections/test.chunks/files/' + id.to_s
|
847
|
+
res.status.should eq 404
|
848
|
+
end
|
849
|
+
|
850
|
+
it 'returns 404 if the database is not found' do
|
851
|
+
id = @grid.put('qux')
|
852
|
+
res = @api.delete '/servers/localhost/databases/__genghis_spec_fake_db__/collections/test.files/files/' + id.to_s
|
853
|
+
res.status.should eq 404
|
854
|
+
end
|
855
|
+
end
|
856
|
+
end
|
663
857
|
end
|
664
858
|
end
|
665
859
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -30,6 +30,10 @@ RSpec.configure do |config|
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
def encode_upload(file)
|
34
|
+
"data:text/plain;base64," + Base64.strict_encode64(file)
|
35
|
+
end
|
36
|
+
|
33
37
|
config.after :all do
|
34
38
|
# Kill any outstanding Genghis backend
|
35
39
|
Process.kill('HUP', @genghis_pid) unless @genghis_pid.nil?
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: genghisapp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1
|
5
|
-
prerelease:
|
4
|
+
version: 2.2.0.beta.1
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Justin Hileman
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: vegas
|