mongo_browser 0.1.3 → 0.2.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.travis.yml +3 -3
- data/README.md +1 -25
- data/Rakefile +0 -1
- data/app/assets/images/background.png +0 -0
- data/app/assets/javascripts/app/controllers/alerts.js.coffee +12 -0
- data/app/assets/javascripts/app/controllers/breadcrumbs.js.coffee +25 -0
- data/app/assets/javascripts/app/controllers/collections.js.coffee +40 -0
- data/app/assets/javascripts/app/controllers/databases.js.coffee +39 -0
- data/app/assets/javascripts/app/controllers/documents.js.coffee +49 -0
- data/app/assets/javascripts/app/controllers/main.js.coffee +10 -0
- data/app/assets/javascripts/app/controllers/server_info.js.coffee +14 -0
- data/app/assets/javascripts/app/controllers.js.coffee +2 -0
- data/app/assets/javascripts/app/directives.js.coffee +20 -0
- data/app/assets/javascripts/app/filters.js.coffee +48 -0
- data/app/assets/javascripts/app/modules/dialogs.js.coffee +29 -0
- data/app/assets/javascripts/app/modules/pager.js.coffee +87 -0
- data/app/assets/javascripts/app/modules/table_filter.js.coffee +27 -0
- data/app/assets/javascripts/app/resources.js.coffee +22 -0
- data/app/assets/javascripts/app/services.js.coffee +36 -0
- data/app/assets/javascripts/app.js.coffee +8 -0
- data/app/assets/javascripts/application.js.coffee +35 -6
- data/app/assets/javascripts/templates/.gitkeep +0 -0
- data/app/assets/javascripts/templates.js.coffee +1 -0
- data/app/assets/javascripts/vendor.js.coffee +5 -0
- data/app/assets/stylesheets/application.css.scss +46 -3
- data/app/assets/templates/collections.html +53 -0
- data/app/assets/templates/databases.html +32 -0
- data/app/assets/templates/documents.html +45 -0
- data/app/assets/templates/pager.html +13 -0
- data/app/{views/server_info.erb → assets/templates/server_info.html} +5 -7
- data/app/assets/templates/table_filter.html +10 -0
- data/bin/mongo_browser +8 -45
- data/config-e2e.ru +20 -0
- data/grunt.js +36 -0
- data/lib/mongo_browser/application.rb +143 -64
- data/lib/mongo_browser/middleware/sprockets_base.rb +11 -0
- data/lib/mongo_browser/middleware/sprockets_sinatra.rb +3 -7
- data/lib/mongo_browser/middleware/sprockets_specs.rb +18 -0
- data/lib/mongo_browser/models/collection.rb +67 -0
- data/lib/mongo_browser/models/database.rb +52 -0
- data/lib/mongo_browser/models/document.rb +17 -0
- data/lib/mongo_browser/models/pager.rb +30 -0
- data/lib/mongo_browser/models/server.rb +51 -0
- data/lib/mongo_browser/version.rb +1 -1
- data/lib/mongo_browser.rb +10 -5
- data/mongo_browser.gemspec +4 -11
- data/public/index.html +47 -0
- data/script/ci_all +21 -0
- data/script/ci_e2e +11 -0
- data/script/ci_javascripts +4 -0
- data/script/ci_rspec +3 -0
- data/spec/features/collections_list_spec.rb +6 -49
- data/spec/features/documents_list_spec.rb +15 -14
- data/spec/features/server_info_spec.rb +3 -3
- data/spec/javascripts/app/controllers/alerts_spec.js.coffee +36 -0
- data/spec/javascripts/app/controllers/breadcrumbs_spec.js.coffee +28 -0
- data/spec/javascripts/app/controllers/collections_spec.js.coffee +78 -0
- data/spec/javascripts/app/controllers/databases_spec.js.coffee +55 -0
- data/spec/javascripts/app/controllers/documents_spec.js.coffee +62 -0
- data/spec/javascripts/app/controllers/main_spec.js.coffee +20 -0
- data/spec/javascripts/app/controllers/server_info_spec.js.coffee +21 -0
- data/spec/javascripts/app/directives_spec.js.coffee +58 -0
- data/spec/javascripts/app/filters_spec.js.coffee +99 -0
- data/spec/javascripts/app/modules/dialogs_spec.js.coffee +51 -0
- data/spec/javascripts/app/modules/pager_spec.js.coffee +104 -0
- data/spec/javascripts/app/modules/table_filter_spec.js.coffee +76 -0
- data/spec/javascripts/app/services_spec.js.coffee +83 -0
- data/spec/javascripts/config/testacular-e2e.conf.js +19 -0
- data/spec/javascripts/config/testacular.conf.js +43 -0
- data/spec/javascripts/e2e/collections_scenario.js.coffee +49 -0
- data/spec/javascripts/e2e/databases_scenario.js.coffee +74 -0
- data/spec/javascripts/e2e/documents_scenario.js.coffee +18 -0
- data/spec/javascripts/e2e/server_info_scenario.js.coffee +12 -0
- data/spec/javascripts/helpers/matchers.js.coffee +5 -0
- data/spec/javascripts/helpers/mocks.js.coffee +7 -0
- data/spec/javascripts/helpers_e2e/app_element.js.coffee +6 -0
- data/spec/javascripts/lib/angular-mocks.js +1740 -0
- data/spec/javascripts/lib/angular-scenario.js +26147 -0
- data/spec/javascripts/lib/jasmine-html.js +681 -0
- data/spec/javascripts/lib/jasmine.css +82 -0
- data/spec/javascripts/lib/jasmine.js +2600 -0
- data/spec/javascripts/runner.html +54 -0
- data/spec/javascripts/runner_e2e.html +10 -0
- data/spec/javascripts/spec.js.coffee +2 -0
- data/spec/javascripts/spec_e2e.js.coffee +2 -0
- data/spec/lib/models/collection_spec.rb +80 -0
- data/spec/lib/models/database_spec.rb +75 -0
- data/spec/lib/models/document_spec.rb +17 -0
- data/spec/lib/models/pager_spec.rb +64 -0
- data/spec/lib/models/server_spec.rb +76 -0
- data/spec/lib/mongo_browser_spec.rb +1 -1
- data/spec/spec_helper.rb +2 -19
- data/spec/support/feature_example_group.rb +8 -3
- data/spec/support/fixtures/databases.json +8 -0
- data/spec/support/fixtures.rb +20 -3
- data/spec/support/matchers/have_flash_message.rb +1 -1
- data/spec/support/mongod.rb +37 -21
- data/spec/support/mongodb.conf +47 -0
- data/vendor/assets/javascripts/angular/angular-bootstrap.js +166 -0
- data/vendor/assets/javascripts/angular/angular-resource.js +435 -0
- data/vendor/assets/javascripts/angular/angular-sanitize.js +535 -0
- data/vendor/assets/javascripts/angular/angular.js +14531 -0
- data/vendor/assets/javascripts/underscore.js +1200 -0
- metadata +136 -148
- data/app/assets/javascripts/app/table_filter.js.coffee +0 -50
- data/app/assets/javascripts/ujs.js.coffee +0 -23
- data/app/views/collections/index.erb +0 -59
- data/app/views/databases/index.erb +0 -29
- data/app/views/documents/index.erb +0 -61
- data/app/views/layout/_flash_messages.erb +0 -10
- data/app/views/layout/_navbar.erb +0 -22
- data/app/views/layout.erb +0 -20
- data/app/views/shared/_filter.erb +0 -14
- data/features/mongo_browser.feature +0 -18
- data/features/step_definitions/mongo_browser_steps.rb +0 -1
- data/features/support/env.rb +0 -18
- data/spec/features/databases_list_spec.rb +0 -65
@@ -0,0 +1,18 @@
|
|
1
|
+
require "mongo_browser/middleware/sprockets_base"
|
2
|
+
|
3
|
+
module MongoBrowser
|
4
|
+
module Middleware
|
5
|
+
class SprocketsSpecs < SprocketsBase
|
6
|
+
def initialize(app, options = {})
|
7
|
+
@app = app
|
8
|
+
@root = options[:root]
|
9
|
+
path = options[:path] || "_specs"
|
10
|
+
@matcher = /^\/#{path}\/*/
|
11
|
+
@environment = ::Sprockets::Environment.new(@root)
|
12
|
+
|
13
|
+
# Serve specs
|
14
|
+
@environment.append_path "spec/javascripts"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module MongoBrowser
|
2
|
+
module Models
|
3
|
+
class Collection
|
4
|
+
attr_reader :mongo_collection
|
5
|
+
|
6
|
+
def initialize(mongo_collection)
|
7
|
+
@mongo_collection = mongo_collection
|
8
|
+
end
|
9
|
+
|
10
|
+
# Return database name for the current collection.
|
11
|
+
def db_name
|
12
|
+
mongo_collection.db.name
|
13
|
+
end
|
14
|
+
|
15
|
+
# Return collection name.
|
16
|
+
def name
|
17
|
+
mongo_collection.name
|
18
|
+
end
|
19
|
+
|
20
|
+
# Return total number of documents.
|
21
|
+
def size
|
22
|
+
mongo_collection.size
|
23
|
+
end
|
24
|
+
|
25
|
+
# Return stats on the collection.
|
26
|
+
#
|
27
|
+
# @return [Hash]
|
28
|
+
def stats
|
29
|
+
mongo_collection.stats
|
30
|
+
end
|
31
|
+
|
32
|
+
def documents_with_pagination(page_number = 1)
|
33
|
+
pager = pager_for(page_number)
|
34
|
+
|
35
|
+
paged_documents = mongo_collection.find
|
36
|
+
.skip(pager.offset)
|
37
|
+
.limit(pager.per_page)
|
38
|
+
|
39
|
+
return paged_documents.map { |doc| Document.new(doc) }, pager
|
40
|
+
end
|
41
|
+
|
42
|
+
def drop!
|
43
|
+
mongo_collection.drop
|
44
|
+
end
|
45
|
+
|
46
|
+
# Finds a document with the given id.
|
47
|
+
#
|
48
|
+
# @return MongoBrowser::Models::Document
|
49
|
+
def find(id)
|
50
|
+
condition = { _id: BSON::ObjectId(id.to_s) }
|
51
|
+
mongo_document = mongo_collection.find(condition).first
|
52
|
+
Document.new(mongo_document) if mongo_document
|
53
|
+
end
|
54
|
+
|
55
|
+
# Removes the given document from the collection.
|
56
|
+
def remove!(document)
|
57
|
+
mongo_collection.remove(_id: document.id)
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def pager_for(page)
|
63
|
+
Pager.new(page, size)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module MongoBrowser
|
2
|
+
module Models
|
3
|
+
class Database
|
4
|
+
attr_reader :mongo_db
|
5
|
+
|
6
|
+
def initialize(mongo_db)
|
7
|
+
@mongo_db = mongo_db
|
8
|
+
end
|
9
|
+
|
10
|
+
def name
|
11
|
+
mongo_db.name
|
12
|
+
end
|
13
|
+
alias :id :name
|
14
|
+
|
15
|
+
def count
|
16
|
+
collections.count
|
17
|
+
end
|
18
|
+
|
19
|
+
def size
|
20
|
+
info["sizeOnDisk"].to_i
|
21
|
+
end
|
22
|
+
|
23
|
+
def collection_names
|
24
|
+
mongo_db.collection_names
|
25
|
+
end
|
26
|
+
|
27
|
+
def collection(name)
|
28
|
+
Collection.new(mongo_db.collection(name))
|
29
|
+
end
|
30
|
+
|
31
|
+
def collections
|
32
|
+
collection_names.map { |name| collection(name) }
|
33
|
+
end
|
34
|
+
|
35
|
+
def stats
|
36
|
+
mongo_db.stats
|
37
|
+
end
|
38
|
+
|
39
|
+
def drop!
|
40
|
+
mongo_db.connection.drop_database(self.name)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def info
|
46
|
+
@info ||= mongo_db.connection["admin"].command(listDatabases: true)["databases"].find do |db|
|
47
|
+
db["name"] == self.name
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module MongoBrowser
|
2
|
+
module Models
|
3
|
+
class Document
|
4
|
+
attr_reader :mongo_document
|
5
|
+
|
6
|
+
def initialize(mongo_document)
|
7
|
+
@mongo_document = mongo_document
|
8
|
+
end
|
9
|
+
|
10
|
+
def id
|
11
|
+
mongo_document["_id"]
|
12
|
+
end
|
13
|
+
|
14
|
+
alias :data :mongo_document
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module MongoBrowser
|
2
|
+
module Models
|
3
|
+
class Pager
|
4
|
+
PER_PAGE = 25
|
5
|
+
|
6
|
+
attr_reader :current_page
|
7
|
+
attr_reader :size
|
8
|
+
|
9
|
+
def initialize(current_page, size)
|
10
|
+
@size = size
|
11
|
+
@current_page = if current_page.to_i <= 0 then 1
|
12
|
+
else
|
13
|
+
[current_page.to_i, total_pages].min
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def per_page
|
18
|
+
PER_PAGE
|
19
|
+
end
|
20
|
+
|
21
|
+
def offset
|
22
|
+
(current_page - 1) * per_page
|
23
|
+
end
|
24
|
+
|
25
|
+
def total_pages
|
26
|
+
(size.to_f / per_page).ceil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module MongoBrowser
|
2
|
+
module Models
|
3
|
+
class Server
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def current
|
7
|
+
new(MongoBrowser.mongodb_host, MongoBrowser.mongodb_port)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :host
|
12
|
+
attr_reader :port
|
13
|
+
|
14
|
+
def initialize(host, port)
|
15
|
+
@host, @port = host, port
|
16
|
+
end
|
17
|
+
|
18
|
+
# Return database for the give name.
|
19
|
+
#
|
20
|
+
# @return MongoBrowser::Models::Database
|
21
|
+
def database(name)
|
22
|
+
Database.new(connection.db(name))
|
23
|
+
end
|
24
|
+
|
25
|
+
# Return a list of available database names.
|
26
|
+
#
|
27
|
+
# @return [String]
|
28
|
+
def database_names
|
29
|
+
connection.database_names.reject { |name| name == "admin" }
|
30
|
+
end
|
31
|
+
|
32
|
+
# Return a list of available databases.
|
33
|
+
#
|
34
|
+
# @return [MongoBrowser::Models::Database]
|
35
|
+
def databases
|
36
|
+
database_names.map { |name| database(name) }
|
37
|
+
end
|
38
|
+
|
39
|
+
# Get the build information for the current connection.
|
40
|
+
#
|
41
|
+
# @return [Hash]
|
42
|
+
def info
|
43
|
+
connection.server_info
|
44
|
+
end
|
45
|
+
|
46
|
+
def connection
|
47
|
+
@connection ||= Mongo::Connection.new(host, port)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/mongo_browser.rb
CHANGED
@@ -2,24 +2,29 @@ require "mongo_browser/version"
|
|
2
2
|
|
3
3
|
require "mongo"
|
4
4
|
require "json"
|
5
|
-
require "ap"
|
6
5
|
|
7
6
|
module MongoBrowser
|
8
|
-
|
9
|
-
|
7
|
+
DEFAULT_MONGODB_HOST = "127.0.0.1"
|
8
|
+
DEFAULT_MONGODB_PORT = 27017
|
10
9
|
|
11
10
|
class << self
|
12
11
|
attr_writer :mongodb_host
|
13
12
|
attr_writer :mongodb_port
|
14
13
|
|
15
14
|
def mongodb_host
|
16
|
-
@mongodb_host ||
|
15
|
+
@mongodb_host || DEFAULT_MONGODB_HOST
|
17
16
|
end
|
18
17
|
|
19
18
|
def mongodb_port
|
20
|
-
@mongodb_port ||
|
19
|
+
@mongodb_port || DEFAULT_MONGODB_PORT
|
21
20
|
end
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
24
|
+
require "mongo_browser/models/pager"
|
25
|
+
require "mongo_browser/models/server"
|
26
|
+
require "mongo_browser/models/database"
|
27
|
+
require "mongo_browser/models/collection"
|
28
|
+
require "mongo_browser/models/document"
|
29
|
+
|
25
30
|
require "mongo_browser/application"
|
data/mongo_browser.gemspec
CHANGED
@@ -16,26 +16,19 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.version = MongoBrowser::VERSION
|
17
17
|
|
18
18
|
gem.add_development_dependency("rdoc", "~> 3.12")
|
19
|
-
gem.add_development_dependency("aruba", "~> 0.5.1")
|
20
19
|
gem.add_development_dependency("rake", "~> 10.0.2")
|
21
20
|
|
21
|
+
gem.add_development_dependency("thin", "~> 1.5.0")
|
22
22
|
gem.add_development_dependency("rspec", "~> 2.12.0")
|
23
|
-
gem.add_development_dependency("capybara", "~> 1.1.3")
|
24
|
-
gem.add_development_dependency("capybara-webkit", "~> 0.13.0")
|
25
|
-
gem.add_development_dependency("launchy", "~> 2.1.2")
|
26
23
|
gem.add_development_dependency("simplecov", "~> 0.7.1")
|
27
24
|
gem.add_development_dependency("debugger", "~> 1.2.2")
|
28
25
|
|
29
|
-
gem.add_dependency("mongo", "~> 1.
|
30
|
-
gem.add_dependency("bson_ext", "~> 1.
|
31
|
-
gem.add_dependency("
|
32
|
-
gem.add_dependency("foreverb", "~> 0.3.2")
|
33
|
-
gem.add_dependency("awesome_print", "~> 1.1.0")
|
26
|
+
gem.add_dependency("mongo", "~> 1.8.0")
|
27
|
+
gem.add_dependency("bson_ext", "~> 1.8.0")
|
28
|
+
gem.add_dependency("vegas", "~> 0.1.11")
|
34
29
|
|
35
30
|
gem.add_dependency("sinatra", "~> 1.3.3")
|
36
31
|
gem.add_dependency("sinatra-contrib", "~> 1.3.2")
|
37
|
-
gem.add_dependency("sinatra-flash", "~> 0.3.0")
|
38
|
-
gem.add_dependency("will_paginate-bootstrap", "~> 0.2.1")
|
39
32
|
gem.add_dependency("json", "~> 1.7.5")
|
40
33
|
|
41
34
|
gem.add_dependency("sprockets", "~> 2.8.1")
|
data/public/index.html
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html ng-app="mb">
|
3
|
+
<head>
|
4
|
+
<title>Mongo Browser</title>
|
5
|
+
<link href="/assets/application.css" rel="stylesheet" media="screen">
|
6
|
+
</head>
|
7
|
+
<body ng-controller="main">
|
8
|
+
<div class="navbar navbar navbar-fixed-top">
|
9
|
+
<div class="navbar-inner">
|
10
|
+
<div class="container">
|
11
|
+
<a class="brand" href="/">MongoBrowser</a>
|
12
|
+
<div class="nav-collapse collapse">
|
13
|
+
<ul ng-controller="breadcrumbs" class="nav breadcrumbs">
|
14
|
+
<li ng-show="showDatabase()">
|
15
|
+
<a href="{{database | collectionsPath}}">{{database.name}}</a>
|
16
|
+
</li>
|
17
|
+
|
18
|
+
<li ng-show="showCollection()">
|
19
|
+
<a href="{{collection | documentsPath}}">{{collection.name}}</a>
|
20
|
+
</li>
|
21
|
+
</ul>
|
22
|
+
|
23
|
+
<ul class="nav pull-right">
|
24
|
+
<li><a href="/server_info">Server Info</a></li>
|
25
|
+
<li><a>v. {{appVersion}}</a></li>
|
26
|
+
</ul>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
|
32
|
+
<aside ng-controller="alerts" id="alerts">
|
33
|
+
<div ng-repeat="message in alertMessages" class="alert alert-{{message.type}}">
|
34
|
+
<button ng-click="disposeAlert(message.id)" type="button" class="close">×</button>
|
35
|
+
<strong>{{message.type}}</strong> <span>{{message.text}}</span>
|
36
|
+
</div>
|
37
|
+
</aside>
|
38
|
+
|
39
|
+
<section class="container fluid">
|
40
|
+
<section ng-view></section>
|
41
|
+
</section>
|
42
|
+
|
43
|
+
<!--<link type="text/css" rel="stylesheet" href="//fonts.googleapis.com/css?family=Rokkitt:400,700|Source+Code+Pro">-->
|
44
|
+
<script src="/assets/vendor.js"></script>
|
45
|
+
<script src="/assets/application.js"></script>
|
46
|
+
</body>
|
47
|
+
</html>
|
data/script/ci_all
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
echo "Running rspec scenarios.."
|
4
|
+
./script/ci_rspec
|
5
|
+
RSPEC_RESULT=$?
|
6
|
+
|
7
|
+
echo -e "\nRunning javascripts scenarios..\n"
|
8
|
+
./script/ci_javascripts
|
9
|
+
JAVASCRIPTS_RESULT=$?
|
10
|
+
|
11
|
+
echo -e "\nRunning e2e scenarios..\n"
|
12
|
+
./script/ci_e2e
|
13
|
+
E2E_RESULT=$?
|
14
|
+
|
15
|
+
if [ $RSPEC_RESULT -eq 1 -o $CUCUMBER_RESULT -eq 1 -o $JAVASCRIPTS_RESULT -eq 1 -o $E2E_RESULT -eq 1 ]; then
|
16
|
+
echo "error"
|
17
|
+
exit 1
|
18
|
+
else
|
19
|
+
echo "allOk"
|
20
|
+
exit 0
|
21
|
+
fi
|
data/script/ci_e2e
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
# Start test backend instance
|
4
|
+
bundle exec thin start -R config-e2e.ru -e test -p 3001 -d
|
5
|
+
|
6
|
+
testacular start spec/javascripts/config/testacular-e2e.conf.js --single-run
|
7
|
+
RESULT=$?
|
8
|
+
|
9
|
+
# Kill test backend instance
|
10
|
+
kill `cat tmp/pids/thin.pid`
|
11
|
+
exit $RESULT
|
data/script/ci_rspec
ADDED
@@ -1,65 +1,22 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe "Collections list", type: :request do
|
3
|
+
describe "Collections list", type: :request, js: true do
|
4
4
|
before do
|
5
5
|
visit "/"
|
6
6
|
|
7
7
|
within("table.databases") { click_link "first_database" }
|
8
8
|
end
|
9
9
|
|
10
|
-
|
10
|
+
xit "displays the breadcrumb" do
|
11
11
|
within ".breadcrumbs" do
|
12
12
|
within "li:nth-child(1)" do
|
13
|
-
expect(page).to have_link("first_database", href: "
|
13
|
+
expect(page).to have_link("first_database", href: "/databases/first_database/collections")
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
expect(page).to have_content("first_database collections")
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
it "displays all available collections for the selected database" do
|
25
|
-
within "table" do
|
26
|
-
expect(page).to have_link("first_collection")
|
27
|
-
expect(page).to have_link("second_collection")
|
28
|
-
expect(page).to have_link("third_collection")
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
it "displays information about the database", js: true do
|
33
|
-
click_link "Stats"
|
34
|
-
|
35
|
-
within "table" do
|
36
|
-
%w(db collection objects avgObjSize dataSize storageSize numExtents indexes indexSize nsSizeMB ok).each do |field|
|
37
|
-
expect(page).to have_content(field)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe "filtering", js: true do
|
43
|
-
it "filters collections by name" do
|
44
|
-
fill_in_filter("second")
|
45
|
-
|
46
|
-
within "table.collections" do
|
47
|
-
expect(page).to have_link("second_collection")
|
48
|
-
expect(page).to_not have_link("first_collection")
|
49
|
-
expect(page).to_not have_link("third_collection")
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
it "displays a notification when nothing has been found" do
|
54
|
-
fill_in_filter("fifth")
|
55
|
-
|
56
|
-
expect(page).to_not have_css("table.collections")
|
57
|
-
expect(page).to have_content("Nothing has been found.")
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
describe "click on delete collection button", js: true do
|
62
|
-
it "deletes a collection" do
|
18
|
+
describe "click on delete collection button" do
|
19
|
+
xit "deletes a collection" do
|
63
20
|
click_delete_button_for("second_collection")
|
64
21
|
confirm_dialog
|
65
22
|
|
@@ -88,7 +45,7 @@ describe "Collections list", type: :request do
|
|
88
45
|
should_hide_the_table_and_display_a_notification
|
89
46
|
end
|
90
47
|
|
91
|
-
|
48
|
+
xit "displays error message when the collection cannot be deleted" do
|
92
49
|
click_delete_button_for("system.indexes")
|
93
50
|
confirm_dialog
|
94
51
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe "Documents list", type: :request do
|
3
|
+
describe "Documents list", type: :request, js: true do
|
4
4
|
let(:connection) { Fixtures.instance.connection }
|
5
5
|
|
6
6
|
before do
|
@@ -11,19 +11,20 @@ describe "Documents list", type: :request do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
shared_examples "breadcrumbs for documents list" do
|
14
|
-
|
14
|
+
xit "displays the breadcrumb" do
|
15
15
|
within ".breadcrumbs" do
|
16
16
|
within "li:nth-child(1)" do
|
17
17
|
expect(page).to have_link("first_database")
|
18
18
|
end
|
19
19
|
|
20
20
|
within "li:nth-child(2)" do
|
21
|
-
|
21
|
+
href = "/databases/first_database/collections/#{current_collection_name}/documents"
|
22
|
+
expect(page).to have_link(current_collection_name, href: href)
|
22
23
|
end
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
26
|
-
|
27
|
+
xit "has a valid title" do
|
27
28
|
within "h2" do
|
28
29
|
expect(page).to have_content("#{current_collection_name} documents")
|
29
30
|
end
|
@@ -35,7 +36,7 @@ describe "Documents list", type: :request do
|
|
35
36
|
|
36
37
|
include_examples "breadcrumbs for documents list"
|
37
38
|
|
38
|
-
|
39
|
+
xit "displays all documents for the selected collection" do
|
39
40
|
expect(page).to have_css("tr.document", count: 2)
|
40
41
|
|
41
42
|
within "table" do
|
@@ -44,24 +45,24 @@ describe "Documents list", type: :request do
|
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
47
|
-
|
48
|
-
click_link "
|
48
|
+
xit "displays information about the collection" do
|
49
|
+
click_link "Collection stats"
|
49
50
|
|
50
51
|
within "table" do
|
51
|
-
%w(ns count size avgObjSize storageSize numExtents nindexes lastExtentSize paddingFactor
|
52
|
+
%w(ns count size avgObjSize storageSize numExtents nindexes lastExtentSize paddingFactor totalIndexSize indexSizes ok).each do |field|
|
52
53
|
expect(page).to have_content(field)
|
53
54
|
end
|
54
55
|
end
|
55
56
|
end
|
56
57
|
|
57
|
-
describe "click on delete document button"
|
58
|
+
describe "click on delete document button" do
|
58
59
|
let(:document) do
|
59
60
|
database = connection.db("first_database")
|
60
61
|
collection = database.collection(current_collection_name)
|
61
62
|
collection.find_one(name: "This is the second sample record")
|
62
63
|
end
|
63
64
|
|
64
|
-
|
65
|
+
xit "removes a document from the collection" do
|
65
66
|
click_delete_button_for(document)
|
66
67
|
confirm_dialog
|
67
68
|
|
@@ -76,8 +77,8 @@ describe "Documents list", type: :request do
|
|
76
77
|
end
|
77
78
|
|
78
79
|
def click_delete_button_for(document)
|
79
|
-
|
80
|
-
within(
|
80
|
+
document_row = find("tr.id-#{document["_id"]}")
|
81
|
+
within(document_row) { click_link "Delete" }
|
81
82
|
end
|
82
83
|
end
|
83
84
|
end
|
@@ -98,7 +99,7 @@ describe "Documents list", type: :request do
|
|
98
99
|
|
99
100
|
include_examples "breadcrumbs for documents list"
|
100
101
|
|
101
|
-
|
102
|
+
xit "displays a pagination" do
|
102
103
|
expect(page).to have_css("div.pagination", count: 2)
|
103
104
|
within "div.pagination" do
|
104
105
|
(1..3).each do |n|
|
@@ -107,7 +108,7 @@ describe "Documents list", type: :request do
|
|
107
108
|
end
|
108
109
|
end
|
109
110
|
|
110
|
-
|
111
|
+
xit "paginates documents" do
|
111
112
|
within "table.documents" do
|
112
113
|
(0...25).each do |n|
|
113
114
|
expect(page).to have_content("Document #{n}")
|
@@ -1,19 +1,19 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe "Server info", type: :request do
|
3
|
+
describe "Server info", type: :request, js: true do
|
4
4
|
before do
|
5
5
|
visit "/"
|
6
6
|
|
7
7
|
within(".navbar") { click_link "Server Info" }
|
8
8
|
end
|
9
9
|
|
10
|
-
|
10
|
+
xit "has a valid title" do
|
11
11
|
within "h2" do
|
12
12
|
expect(page).to have_content("server info")
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
|
16
|
+
xit "displays information about the server" do
|
17
17
|
within "table" do
|
18
18
|
%w(version gitVersion sysInfo versionArray bits debug maxBsonObjectSize ok).each do |field|
|
19
19
|
expect(page).to have_content(field)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
describe "alerts", ->
|
2
|
+
beforeEach module("mb.controllers")
|
3
|
+
|
4
|
+
$scope = null
|
5
|
+
alerts = null
|
6
|
+
|
7
|
+
beforeEach inject ($injector, $rootScope, $controller) ->
|
8
|
+
$scope = $rootScope.$new()
|
9
|
+
|
10
|
+
alerts = $injector.get("alerts")
|
11
|
+
|
12
|
+
$controller "alerts",
|
13
|
+
$scope: $scope,
|
14
|
+
alerts: alerts
|
15
|
+
|
16
|
+
it "assings flash messages", ->
|
17
|
+
expect($scope.alertMessages).toBeDefined()
|
18
|
+
expect($scope.alertMessages).toEqual([])
|
19
|
+
|
20
|
+
alerts.info("Test message.")
|
21
|
+
expect($scope.alertMessages).toContain(id: 1, type: "info", text: "Test message.")
|
22
|
+
|
23
|
+
describe "#disposeAlert", ->
|
24
|
+
it "disposes an alert at the given index", ->
|
25
|
+
# Given
|
26
|
+
alerts.info("Information..")
|
27
|
+
alerts.error("Error..")
|
28
|
+
spyOn(alerts, "dispose").andCallThrough()
|
29
|
+
|
30
|
+
# When
|
31
|
+
$scope.disposeAlert(2)
|
32
|
+
|
33
|
+
# Then
|
34
|
+
expect(alerts.dispose).toHaveBeenCalledWith(2)
|
35
|
+
expect($scope.alertMessages).toContain(id: 1, type: "info", text: "Information..")
|
36
|
+
expect($scope.alertMessages).not.toContain(id: 2, type: "error", text: "Error..")
|
@@ -0,0 +1,28 @@
|
|
1
|
+
describe "breadcrumbs", ->
|
2
|
+
beforeEach module("mb.controllers")
|
3
|
+
|
4
|
+
$scope = null
|
5
|
+
|
6
|
+
beforeEach inject ($rootScope, $controller) ->
|
7
|
+
$scope = $rootScope.$new()
|
8
|
+
|
9
|
+
$controller "breadcrumbs",
|
10
|
+
$scope: $scope,
|
11
|
+
|
12
|
+
describe "#showDatabase", ->
|
13
|
+
it "return true when the database is available", ->
|
14
|
+
$scope.dbName = "foo"
|
15
|
+
expect($scope.showDatabase()).toBeTruthy()
|
16
|
+
|
17
|
+
it "return false when the database is not available", ->
|
18
|
+
$scope.dbName = null
|
19
|
+
expect($scope.showDatabase()).toBeFalsy()
|
20
|
+
|
21
|
+
describe "#showCollection", ->
|
22
|
+
it "return true when the database is available", ->
|
23
|
+
$scope.collectionName = "foo"
|
24
|
+
expect($scope.showCollection()).toBeTruthy()
|
25
|
+
|
26
|
+
it "return false when the database is not available", ->
|
27
|
+
$scope.collectionName = null
|
28
|
+
expect($scope.showCollection()).toBeFalsy()
|