mongo_browser 0.2.0.rc2 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -1
- data/.rspec +1 -1
- data/.travis.yml +6 -1
- data/CHANGELOG.md +15 -0
- data/{grunt.js → Gruntfile.js} +10 -8
- data/Procfile +1 -0
- data/README.md +44 -2
- data/Rakefile +1 -12
- data/app/assets/images/ajax-loader.gif +0 -0
- data/app/assets/javascripts/app/controllers/{breadcrumbs.js.coffee → breadcrumbs_controller.js.coffee} +4 -7
- data/app/assets/javascripts/app/controllers/collections/index_controller.js.coffee +38 -0
- data/app/assets/javascripts/app/controllers/collections/stats_controller.js.coffee +17 -0
- data/app/assets/javascripts/app/controllers/{databases.js.coffee → databases/index_controller.js.coffee} +11 -15
- data/app/assets/javascripts/app/controllers/databases/stats_controller.js.coffee +15 -0
- data/app/assets/javascripts/app/controllers/documents/index_controller.js.coffee +54 -0
- data/app/assets/javascripts/app/controllers/documents/show_controller.js.coffee +38 -0
- data/app/assets/javascripts/app/controllers/main_controller.js.coffee +15 -0
- data/app/assets/javascripts/app/controllers/servers/show_controller.js.coffee +17 -0
- data/app/assets/javascripts/app/directives.js.coffee +23 -0
- data/app/assets/javascripts/app/filters.js.coffee +14 -1
- data/app/assets/javascripts/app/modules/alerts.js.coffee +58 -0
- data/app/assets/javascripts/app/modules/pager.js.coffee +2 -2
- data/app/assets/javascripts/app/modules/spinner.js.coffee +29 -0
- data/app/assets/javascripts/app/modules/table_filter.js.coffee +4 -4
- data/app/assets/javascripts/app/resources.js.coffee +14 -8
- data/app/assets/javascripts/app/services.js.coffee +11 -33
- data/app/assets/javascripts/application.js.coffee +62 -34
- data/app/assets/javascripts/application.test.js.coffee +5 -0
- data/app/assets/javascripts/compiled_templates.js.coffee +1 -0
- data/app/assets/javascripts/vendor.js.coffee +0 -1
- data/app/assets/stylesheets/application.css.scss +36 -18
- data/{public/index.html → app/views/index.erb} +8 -8
- data/bin/mongo_browser +2 -13
- data/config.ru +3 -1
- data/lib/mongo_browser.rb +1 -0
- data/lib/mongo_browser/api.rb +11 -0
- data/lib/mongo_browser/api/collections.rb +34 -0
- data/lib/mongo_browser/api/databases.rb +32 -0
- data/lib/mongo_browser/api/documents.rb +37 -0
- data/lib/mongo_browser/api/mongo.rb +41 -0
- data/lib/mongo_browser/application.rb +8 -174
- data/lib/mongo_browser/application/development.rb +32 -0
- data/lib/mongo_browser/cli.rb +48 -0
- data/lib/mongo_browser/entities.rb +43 -0
- data/lib/mongo_browser/models/collection.rb +7 -12
- data/lib/mongo_browser/models/document.rb +5 -1
- data/lib/mongo_browser/models/pager.rb +22 -9
- data/lib/mongo_browser/version.rb +1 -1
- data/mongo_browser.gemspec +22 -15
- data/package.json +30 -0
- data/public/ng/templates/alerts.html +6 -0
- data/public/ng/templates/collections/index.html +39 -0
- data/public/ng/templates/collections/stats.html +18 -0
- data/public/ng/templates/databases/index.html +35 -0
- data/public/ng/templates/databases/stats.html +18 -0
- data/public/ng/templates/documents/index.html +40 -0
- data/public/ng/templates/documents/show.html +17 -0
- data/{app/assets → public/ng}/templates/pager.html +0 -0
- data/{app/assets/templates/server_info.html → public/ng/templates/server/show.html} +1 -1
- data/{app/assets → public/ng}/templates/table_filter.html +0 -0
- data/script/ci_all +5 -1
- data/script/ci_e2e +5 -2
- data/script/ci_javascripts +1 -1
- data/script/ci_rspec +1 -1
- data/spec/javascripts/app/controllers/{breadcrumbs_spec.js.coffee → breadcrumbs_controller_spec.js.coffee} +1 -1
- data/spec/javascripts/app/controllers/collections/index_controller_spec.js.coffee +95 -0
- data/spec/javascripts/app/controllers/collections/stats_controller_spec.js.coffee +34 -0
- data/spec/javascripts/app/controllers/databases/index_controller_spec.js.coffee +93 -0
- data/spec/javascripts/app/controllers/databases/stats_controller_spec.js.coffee +30 -0
- data/spec/javascripts/app/controllers/documents/index_controller_spec.js.coffee +108 -0
- data/spec/javascripts/app/controllers/documents/show_controller_spec.js.coffee +94 -0
- data/spec/javascripts/app/controllers/{main_spec.js.coffee → main_controller_spec.js.coffee} +2 -2
- data/spec/javascripts/app/controllers/{server_info_spec.js.coffee → server/show_controller_spec.js.coffee} +5 -6
- data/spec/javascripts/app/directives_spec.js.coffee +108 -24
- data/spec/javascripts/app/filters_spec.js.coffee +31 -5
- data/spec/javascripts/app/modules/alerts_spec.js.coffee +138 -0
- data/spec/javascripts/app/modules/dialogs_spec.js.coffee +1 -2
- data/spec/javascripts/app/modules/pager_spec.js.coffee +0 -1
- data/spec/javascripts/app/modules/spinner_spec.js.coffee +65 -0
- data/spec/javascripts/app/modules/table_filter_spec.js.coffee +9 -9
- data/spec/javascripts/app/resources_spec.js.coffee +99 -0
- data/spec/javascripts/app/services_spec.js.coffee +31 -71
- data/spec/javascripts/config/{testacular-e2e.conf.js → karma-e2e.conf.js} +1 -1
- data/spec/javascripts/config/{testacular.conf.js → karma.conf.js} +2 -3
- data/spec/javascripts/e2e/collection_stats_scenario.js.coffee +12 -0
- data/spec/javascripts/e2e/collections_scenario.js.coffee +59 -20
- data/spec/javascripts/e2e/database_stats_scenario.js.coffee +11 -0
- data/spec/javascripts/e2e/databases_scenario.js.coffee +37 -36
- data/spec/javascripts/e2e/document_show_scenario.js.coffee +31 -0
- data/spec/javascripts/e2e/documents_pagination_scenario.js.coffee +33 -0
- data/spec/javascripts/e2e/documents_scenario.js.coffee +43 -4
- data/spec/javascripts/e2e/server_info_scenario.js.coffee +8 -2
- data/spec/javascripts/helpers/mocks.js.coffee +2 -0
- data/spec/javascripts/helpers_e2e/dsl.js.coffee +20 -0
- data/spec/javascripts/lib/angular-mocks.js +64 -16
- data/spec/javascripts/lib/angular-scenario.js +724 -561
- data/spec/javascripts/runner.html +5 -5
- data/spec/lib/api/collections_spec.rb +62 -0
- data/spec/lib/api/databases_spec.rb +58 -0
- data/spec/lib/api/documents_spec.rb +135 -0
- data/spec/lib/api/mongo_spec.rb +27 -0
- data/spec/lib/cli_spec.rb +19 -0
- data/spec/lib/entities_spec.rb +39 -0
- data/spec/lib/models/collection_spec.rb +16 -10
- data/spec/lib/models/database_spec.rb +4 -4
- data/spec/lib/models/document_spec.rb +5 -5
- data/spec/lib/models/pager_spec.rb +20 -11
- data/spec/spec_helper.rb +7 -15
- data/spec/support/api_example_group.rb +45 -0
- data/spec/support/fixtures.rb +10 -6
- data/spec/support/matchers/expose.rb +18 -0
- data/vendor/assets/javascripts/angular/angular-bootstrap.js +1 -1
- data/vendor/assets/javascripts/angular/angular-resource.js +78 -56
- data/vendor/assets/javascripts/angular/angular-sanitize.js +3 -1
- data/vendor/assets/javascripts/angular/angular.js +720 -404
- metadata +323 -183
- data/app/assets/javascripts/app.js.coffee +0 -8
- data/app/assets/javascripts/app/controllers.js.coffee +0 -2
- data/app/assets/javascripts/app/controllers/alerts.js.coffee +0 -12
- data/app/assets/javascripts/app/controllers/collections.js.coffee +0 -40
- data/app/assets/javascripts/app/controllers/documents.js.coffee +0 -49
- data/app/assets/javascripts/app/controllers/main.js.coffee +0 -10
- data/app/assets/javascripts/app/controllers/server_info.js.coffee +0 -14
- data/app/assets/javascripts/templates.js.coffee +0 -1
- data/app/assets/javascripts/templates/.gitkeep +0 -0
- data/app/assets/templates/collections.html +0 -53
- data/app/assets/templates/databases.html +0 -32
- data/app/assets/templates/documents.html +0 -45
- data/config-e2e.ru +0 -20
- data/spec/features/collections_list_spec.rb +0 -64
- data/spec/features/documents_list_spec.rb +0 -139
- data/spec/features/server_info_spec.rb +0 -23
- data/spec/javascripts/app/controllers/alerts_spec.js.coffee +0 -36
- data/spec/javascripts/app/controllers/collections_spec.js.coffee +0 -78
- data/spec/javascripts/app/controllers/databases_spec.js.coffee +0 -55
- data/spec/javascripts/app/controllers/documents_spec.js.coffee +0 -62
- data/spec/javascripts/helpers_e2e/app_element.js.coffee +0 -6
- data/spec/support/feature_example_group.rb +0 -53
- data/spec/support/matchers/have_flash_message.rb +0 -16
- data/spec/support/mongod.rb +0 -91
- data/spec/support/mongodb.conf +0 -47
@@ -1,12 +0,0 @@
|
|
1
|
-
module = angular.module("mb.controllers")
|
2
|
-
|
3
|
-
class AlertsController
|
4
|
-
constructor: (@$scope, @alerts) ->
|
5
|
-
@$scope.alertMessages = @alerts.messages
|
6
|
-
|
7
|
-
@$scope.disposeAlert = (id) =>
|
8
|
-
@alerts.dispose(id)
|
9
|
-
|
10
|
-
AlertsController.$inject = ["$scope", "alerts"]
|
11
|
-
|
12
|
-
module.controller "alerts", AlertsController
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module = angular.module("mb.controllers")
|
2
|
-
|
3
|
-
# TODO clenup this controller, see DatabasesController
|
4
|
-
class CollectionsController
|
5
|
-
constructor: (@$scope, @$routeParams, @Collection, @$http, @confirmationDialog, @alerts) ->
|
6
|
-
|
7
|
-
@$scope.dbName = @$routeParams.dbName
|
8
|
-
@$scope.filterValue = ""
|
9
|
-
|
10
|
-
_onLoadComplete = (data) =>
|
11
|
-
@$scope.collections = data
|
12
|
-
@$scope.loading = false
|
13
|
-
|
14
|
-
@$scope.fetchCollections = =>
|
15
|
-
@$scope.loading = true
|
16
|
-
@$scope.collections = @Collection.query({ dbName: @$scope.dbName }, _onLoadComplete)
|
17
|
-
|
18
|
-
@$scope.fetchCollections()
|
19
|
-
|
20
|
-
# TODO create resource for this call
|
21
|
-
@$http.get("/api/databases/#{@$scope.dbName}/stats.json").success (data) =>
|
22
|
-
@$scope.dbStats = data
|
23
|
-
|
24
|
-
@$scope.isLoading = => @$scope.loading
|
25
|
-
|
26
|
-
@$scope.delete = (collection) =>
|
27
|
-
@confirmationDialog
|
28
|
-
message: "Deleting #{collection.name}. Are you sure?"
|
29
|
-
onOk: =>
|
30
|
-
resource = new @Collection()
|
31
|
-
params = dbName: collection.dbName, id: collection.name
|
32
|
-
|
33
|
-
resource.$delete params, =>
|
34
|
-
@alerts.info("Collection #{collection.name} has been deleted.")
|
35
|
-
@$scope.fetchCollections()
|
36
|
-
|
37
|
-
CollectionsController.$inject = ["$scope", "$routeParams",
|
38
|
-
"Collection", "$http", "confirmationDialog", "alerts"]
|
39
|
-
|
40
|
-
module.controller "collections", CollectionsController
|
@@ -1,49 +0,0 @@
|
|
1
|
-
module = angular.module("mb.controllers")
|
2
|
-
|
3
|
-
# TODO clenup this controller, see DatabasesController
|
4
|
-
class DocumentsController
|
5
|
-
constructor: (@$scope, @$routeParams, @$http, @Document, @confirmationDialog, @alerts) ->
|
6
|
-
@$scope.dbName = @$routeParams.dbName
|
7
|
-
@$scope.collectionName = @$routeParams.collectionName
|
8
|
-
|
9
|
-
@$scope.isLoading = => @$scope.loading
|
10
|
-
|
11
|
-
_onLoadComplete = (data) =>
|
12
|
-
@$scope.loading = false
|
13
|
-
|
14
|
-
@$scope.documents = data.documents
|
15
|
-
@$scope.page = data.page
|
16
|
-
@$scope.totalPages = data.totalPages
|
17
|
-
@$scope.size = data.size
|
18
|
-
|
19
|
-
@$scope.fetchDocuments = (page = 1) =>
|
20
|
-
return if @$scope.isLoading() # TODO workaround for doule request
|
21
|
-
@$scope.loading = true
|
22
|
-
|
23
|
-
params = dbName: @$scope.dbName, collectionName: @$scope.collectionName, page: page
|
24
|
-
@Document.query(params, _onLoadComplete)
|
25
|
-
|
26
|
-
@$scope.page = 1
|
27
|
-
@$scope.fetchDocuments()
|
28
|
-
|
29
|
-
@$scope.$watch "page", (page) =>
|
30
|
-
@$scope.fetchDocuments(page)
|
31
|
-
|
32
|
-
# TODO create resource for this call
|
33
|
-
@$http.get("/api/databases/#{@$scope.dbName}/collections/#{@$scope.collectionName}/stats.json").success (data) =>
|
34
|
-
@$scope.collectionStats = data
|
35
|
-
|
36
|
-
@$scope.delete = (document) =>
|
37
|
-
@confirmationDialog
|
38
|
-
message: "Are you sure?"
|
39
|
-
onOk: =>
|
40
|
-
resource = new @Document()
|
41
|
-
params = dbName: @$scope.dbName, collectionName: @$scope.collectionName, id: document.id
|
42
|
-
|
43
|
-
resource.$delete params, =>
|
44
|
-
@alerts.info("Document #{document.id} has been deleted.")
|
45
|
-
@$scope.fetchDocuments()
|
46
|
-
|
47
|
-
DocumentsController.$inject = ["$scope", "$routeParams", "$http", "Document", "confirmationDialog", "alerts"]
|
48
|
-
|
49
|
-
module.controller "documents", DocumentsController
|
@@ -1,10 +0,0 @@
|
|
1
|
-
module = angular.module("mb.controllers")
|
2
|
-
|
3
|
-
class MainController
|
4
|
-
constructor: (@$scope, @$http) ->
|
5
|
-
@$http.get("/api/version.json").success (data) =>
|
6
|
-
@$scope.appVersion = data.version
|
7
|
-
|
8
|
-
MainController.$inject = ["$scope", "$http"]
|
9
|
-
|
10
|
-
module.controller "main", MainController
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module = angular.module("mb.controllers")
|
2
|
-
|
3
|
-
class ServerInfo
|
4
|
-
constructor: (@$scope, @$http) ->
|
5
|
-
@$scope.loading = true
|
6
|
-
@$http.get("/api/server_info.json").success(@onLoadComplete)
|
7
|
-
|
8
|
-
onLoadComplete: (data) =>
|
9
|
-
@$scope.serverInfo = data
|
10
|
-
@$scope.loading = false
|
11
|
-
|
12
|
-
ServerInfo.$inject = ["$scope", "$http"]
|
13
|
-
|
14
|
-
module.controller "serverInfo", ServerInfo
|
@@ -1 +0,0 @@
|
|
1
|
-
#= require_tree ./templates
|
File without changes
|
@@ -1,53 +0,0 @@
|
|
1
|
-
<header>
|
2
|
-
<h2>{{dbName}} collections</h2>
|
3
|
-
</header>
|
4
|
-
|
5
|
-
<div class="tabbable">
|
6
|
-
<div class="tab-pane" title="Collections" ng-hide="isLoading()">
|
7
|
-
<table-filter value="filterValue.name" placeholder="Enter collection name"></table-filter>
|
8
|
-
|
9
|
-
<table ng-show="(collections | filter:filterValue).length" class="table table-striped table-hover collections">
|
10
|
-
<thead>
|
11
|
-
<tr>
|
12
|
-
<th>Name</th>
|
13
|
-
<th>Documents</th>
|
14
|
-
<th class="actions"> </th>
|
15
|
-
</tr>
|
16
|
-
</thead>
|
17
|
-
<tbody>
|
18
|
-
<tr ng-repeat="collection in collections | orderBy:'name' | filter:filterValue">
|
19
|
-
<td>
|
20
|
-
<a href="{{collection | documentsPath}}">
|
21
|
-
{{collection.name}}
|
22
|
-
</a>
|
23
|
-
</td>
|
24
|
-
<td>{{collection.size}}</td>
|
25
|
-
<td class="actions">
|
26
|
-
<delete-button ng-click="delete(collection)" />
|
27
|
-
</td>
|
28
|
-
</tr>
|
29
|
-
</tbody>
|
30
|
-
</table>
|
31
|
-
|
32
|
-
<div ng-hide="(collections | filter:filterValue).length" class="filter alert">
|
33
|
-
Nothing has been found.
|
34
|
-
</div>
|
35
|
-
</div>
|
36
|
-
|
37
|
-
<div class="tab-pane" title="Database stats">
|
38
|
-
<table class="table table-striped table-hover">
|
39
|
-
<thead>
|
40
|
-
<tr>
|
41
|
-
<th>Property</th>
|
42
|
-
<th>Value</th>
|
43
|
-
</tr>
|
44
|
-
</thead>
|
45
|
-
<tbody>
|
46
|
-
<tr ng-repeat="(property, value) in dbStats">
|
47
|
-
<td>{{property}}</td>
|
48
|
-
<td>{{value}}</td>
|
49
|
-
</tr>
|
50
|
-
</tbody>
|
51
|
-
</table>
|
52
|
-
</div>
|
53
|
-
</div>
|
@@ -1,32 +0,0 @@
|
|
1
|
-
<header>
|
2
|
-
<h2>localhost databases</h2>
|
3
|
-
</header>
|
4
|
-
|
5
|
-
<div ng-hide="isLoading()">
|
6
|
-
<table-filter value="filterValue.name" placeholder="Enter database name"></table-filter>
|
7
|
-
|
8
|
-
<table ng-show="(databases | filter:filterValue).length" class="table table-striped table-hover databases">
|
9
|
-
<thead>
|
10
|
-
<tr>
|
11
|
-
<th>Name</th>
|
12
|
-
<th>Collections</th>
|
13
|
-
<th>Size</th>
|
14
|
-
<th class="actions"> </th>
|
15
|
-
</tr>
|
16
|
-
</thead>
|
17
|
-
<tbody>
|
18
|
-
<tr ng-repeat="database in databases | orderBy:'name' | filter:filterValue">
|
19
|
-
<td><a href="{{database | collectionsPath}}">{{database.name}}</a></td>
|
20
|
-
<td>{{database.count}}</td>
|
21
|
-
<td>{{database.size | humanSize}}</td>
|
22
|
-
<td class="actions">
|
23
|
-
<delete-button ng-click="delete(database)" />
|
24
|
-
</td>
|
25
|
-
</tr>
|
26
|
-
</tbody>
|
27
|
-
</table>
|
28
|
-
|
29
|
-
<div ng-hide="(databases | filter:filterValue).length" class="filter alert">
|
30
|
-
Nothing has been found.
|
31
|
-
</div>
|
32
|
-
</div>
|
@@ -1,45 +0,0 @@
|
|
1
|
-
<header>
|
2
|
-
<h2>{{collectionName}} documents</h2>
|
3
|
-
</header>
|
4
|
-
|
5
|
-
<div class="tabbable">
|
6
|
-
<div class="tab-pane" title="Documents">
|
7
|
-
<pager page="page" total-pages="totalPages"></pager>
|
8
|
-
|
9
|
-
<table class="table table-striped table-hover documents">
|
10
|
-
<thead>
|
11
|
-
<tr>
|
12
|
-
<th>Data</th>
|
13
|
-
<th class="actions"> </th>
|
14
|
-
</tr>
|
15
|
-
</thead>
|
16
|
-
<tbody>
|
17
|
-
<tr ng-repeat="document in documents" class="document id-{{document.id}}">
|
18
|
-
<td class="data" ng-bind-html="document.data | jsonDocument"></td>
|
19
|
-
<td class="actions">
|
20
|
-
<delete-button ng-click="delete(document)" />
|
21
|
-
</td>
|
22
|
-
</tr>
|
23
|
-
</tbody>
|
24
|
-
</table>
|
25
|
-
|
26
|
-
<pager page="page" total-pages="totalPages"></pager>
|
27
|
-
</div>
|
28
|
-
|
29
|
-
<div class="tab-pane" title="Collection stats">
|
30
|
-
<table class="table table-striped table-hover">
|
31
|
-
<thead>
|
32
|
-
<tr>
|
33
|
-
<th>Property</th>
|
34
|
-
<th>Value</th>
|
35
|
-
</tr>
|
36
|
-
</thead>
|
37
|
-
<tbody>
|
38
|
-
<tr ng-repeat="(property, value) in collectionStats">
|
39
|
-
<td>{{property}}</td>
|
40
|
-
<td>{{value}}</td>
|
41
|
-
</tr>
|
42
|
-
</tbody>
|
43
|
-
</table>
|
44
|
-
</div>
|
45
|
-
</div>
|
data/config-e2e.ru
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require "mongo_browser"
|
2
|
-
|
3
|
-
require File.expand_path("spec/support/mongod")
|
4
|
-
require File.expand_path("spec/support/fixtures")
|
5
|
-
|
6
|
-
test_server = Mongod.instance
|
7
|
-
fixtures = Fixtures.instance
|
8
|
-
|
9
|
-
test_server.start! do |port|
|
10
|
-
MongoBrowser.mongodb_host = "127.0.0.1"
|
11
|
-
MongoBrowser.mongodb_port = port
|
12
|
-
end
|
13
|
-
|
14
|
-
fixtures.load!
|
15
|
-
|
16
|
-
run MongoBrowser::Application
|
17
|
-
|
18
|
-
at_exit do
|
19
|
-
test_server.shutdown!
|
20
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe "Collections list", type: :request, js: true do
|
4
|
-
before do
|
5
|
-
visit "/"
|
6
|
-
|
7
|
-
within("table.databases") { click_link "first_database" }
|
8
|
-
end
|
9
|
-
|
10
|
-
xit "displays the breadcrumb" do
|
11
|
-
within ".breadcrumbs" do
|
12
|
-
within "li:nth-child(1)" do
|
13
|
-
expect(page).to have_link("first_database", href: "/databases/first_database/collections")
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe "click on delete collection button" do
|
19
|
-
xit "deletes a collection" do
|
20
|
-
click_delete_button_for("second_collection")
|
21
|
-
confirm_dialog
|
22
|
-
|
23
|
-
expect(page).to have_flash_message("Collection second_collection has been deleted.")
|
24
|
-
|
25
|
-
within "table.collections" do
|
26
|
-
expect(page).to have_link("first_collection")
|
27
|
-
expect(page).to_not have_link("second_collection")
|
28
|
-
expect(page).to have_link("third_collection")
|
29
|
-
end
|
30
|
-
|
31
|
-
click_delete_button_for("first_collection")
|
32
|
-
confirm_dialog
|
33
|
-
expect(page).to have_flash_message("Collection first_collection has been deleted.")
|
34
|
-
|
35
|
-
within "table.collections" do
|
36
|
-
expect(page).to_not have_link("first_collection")
|
37
|
-
expect(page).to_not have_link("second_collection")
|
38
|
-
expect(page).to have_link("third_collection")
|
39
|
-
end
|
40
|
-
|
41
|
-
click_delete_button_for("third_collection")
|
42
|
-
confirm_dialog
|
43
|
-
expect(page).to have_flash_message("Collection third_collection has been deleted.")
|
44
|
-
|
45
|
-
should_hide_the_table_and_display_a_notification
|
46
|
-
end
|
47
|
-
|
48
|
-
xit "displays error message when the collection cannot be deleted" do
|
49
|
-
click_delete_button_for("system.indexes")
|
50
|
-
confirm_dialog
|
51
|
-
|
52
|
-
expect(page).to have_flash_message("Database command 'drop' failed")
|
53
|
-
|
54
|
-
within "table.collections" do
|
55
|
-
expect(page).to have_link("system.indexes")
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def click_delete_button_for(collection_name)
|
60
|
-
collection_row = find(:xpath, %Q{//table//tr//*[contains(text(), "#{collection_name}")]/../..})
|
61
|
-
within(collection_row) { click_link "Delete" }
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
@@ -1,139 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe "Documents list", type: :request, js: true do
|
4
|
-
let(:connection) { Fixtures.instance.connection }
|
5
|
-
|
6
|
-
before do
|
7
|
-
visit "/"
|
8
|
-
|
9
|
-
within("table.databases") { click_link "first_database" }
|
10
|
-
within("table.collections") { click_link current_collection_name }
|
11
|
-
end
|
12
|
-
|
13
|
-
shared_examples "breadcrumbs for documents list" do
|
14
|
-
xit "displays the breadcrumb" do
|
15
|
-
within ".breadcrumbs" do
|
16
|
-
within "li:nth-child(1)" do
|
17
|
-
expect(page).to have_link("first_database")
|
18
|
-
end
|
19
|
-
|
20
|
-
within "li:nth-child(2)" do
|
21
|
-
href = "/databases/first_database/collections/#{current_collection_name}/documents"
|
22
|
-
expect(page).to have_link(current_collection_name, href: href)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
xit "has a valid title" do
|
28
|
-
within "h2" do
|
29
|
-
expect(page).to have_content("#{current_collection_name} documents")
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
context "with small number for documents" do
|
35
|
-
let(:current_collection_name) { "first_collection" }
|
36
|
-
|
37
|
-
include_examples "breadcrumbs for documents list"
|
38
|
-
|
39
|
-
xit "displays all documents for the selected collection" do
|
40
|
-
expect(page).to have_css("tr.document", count: 2)
|
41
|
-
|
42
|
-
within "table" do
|
43
|
-
expect(page).to have_content("This is a sample record")
|
44
|
-
expect(page).to have_content("This is the second sample record")
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
xit "displays information about the collection" do
|
49
|
-
click_link "Collection stats"
|
50
|
-
|
51
|
-
within "table" do
|
52
|
-
%w(ns count size avgObjSize storageSize numExtents nindexes lastExtentSize paddingFactor totalIndexSize indexSizes ok).each do |field|
|
53
|
-
expect(page).to have_content(field)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
describe "click on delete document button" do
|
59
|
-
let(:document) do
|
60
|
-
database = connection.db("first_database")
|
61
|
-
collection = database.collection(current_collection_name)
|
62
|
-
collection.find_one(name: "This is the second sample record")
|
63
|
-
end
|
64
|
-
|
65
|
-
xit "removes a document from the collection" do
|
66
|
-
click_delete_button_for(document)
|
67
|
-
confirm_dialog
|
68
|
-
|
69
|
-
expect(page).to have_flash_message("Document #{document["_id"]} has been deleted.")
|
70
|
-
|
71
|
-
expect(page).to have_css("tr.document", count: 1)
|
72
|
-
|
73
|
-
within "table" do
|
74
|
-
expect(page).to have_content("This is a sample record")
|
75
|
-
expect(page).not_to have_content(document["name"])
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def click_delete_button_for(document)
|
80
|
-
document_row = find("tr.id-#{document["_id"]}")
|
81
|
-
within(document_row) { click_link "Delete" }
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
context "with large number of documents" do
|
87
|
-
let(:current_collection_name) { "second_collection" }
|
88
|
-
|
89
|
-
before do
|
90
|
-
database = connection.db("first_database")
|
91
|
-
collection = database.collection(current_collection_name)
|
92
|
-
|
93
|
-
70.times do |n|
|
94
|
-
collection.insert(name: "Document #{n}", position: n)
|
95
|
-
end
|
96
|
-
|
97
|
-
visit current_path
|
98
|
-
end
|
99
|
-
|
100
|
-
include_examples "breadcrumbs for documents list"
|
101
|
-
|
102
|
-
xit "displays a pagination" do
|
103
|
-
expect(page).to have_css("div.pagination", count: 2)
|
104
|
-
within "div.pagination" do
|
105
|
-
(1..3).each do |n|
|
106
|
-
expect(page).to have_link(n.to_s)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
xit "paginates documents" do
|
112
|
-
within "table.documents" do
|
113
|
-
(0...25).each do |n|
|
114
|
-
expect(page).to have_content("Document #{n}")
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
within "div.pagination" do
|
119
|
-
click_link "2"
|
120
|
-
end
|
121
|
-
|
122
|
-
within "table.documents" do
|
123
|
-
(25...50).each do |n|
|
124
|
-
expect(page).to have_content("Document #{n}")
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
within "div.pagination" do
|
129
|
-
click_link "3"
|
130
|
-
end
|
131
|
-
|
132
|
-
within "table.documents" do
|
133
|
-
(50...70).each do |n|
|
134
|
-
expect(page).to have_content("Document #{n}")
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|