mongo3 0.0.9 → 0.1.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.
Files changed (95) hide show
  1. data/.bnignore +3 -0
  2. data/.bnsignore +16 -0
  3. data/.gitignore +1 -0
  4. data/HISTORY +11 -1
  5. data/README.rdoc +2 -0
  6. data/bin/mongo3 +7 -6
  7. data/config/mongo3.yml +33 -0
  8. data/data/populate +37 -0
  9. data/lib/controllers/collections.rb +2 -10
  10. data/lib/controllers/databases.rb +12 -1
  11. data/lib/controllers/explore.rb +20 -6
  12. data/lib/helpers/collection_helper.rb +34 -2
  13. data/lib/helpers/explore_helper.rb +0 -5
  14. data/lib/helpers/main_helper.rb +5 -0
  15. data/lib/helpers/paths_helper.rb +15 -0
  16. data/lib/mongo3/connection.rb +39 -24
  17. data/lib/mongo3/user.rb +10 -4
  18. data/lib/mongo3/zone.rb +24 -8
  19. data/lib/mongo3.rb +4 -7
  20. data/lib/public/.DS_Store +0 -0
  21. data/lib/public/images/favicon.png +0 -0
  22. data/lib/public/images/information.png +0 -0
  23. data/lib/public/images/tree/Thumbs.db +0 -0
  24. data/lib/public/images/tree/array.png +0 -0
  25. data/lib/public/images/tree/arrow_refresh.png +0 -0
  26. data/lib/public/images/tree/collapsable-last.gif +0 -0
  27. data/lib/public/images/tree/collapsable.gif +0 -0
  28. data/lib/public/images/tree/collection.png +0 -0
  29. data/lib/public/images/tree/cross.png +0 -0
  30. data/lib/public/images/tree/disk.png +0 -0
  31. data/lib/public/images/tree/expandable-last.gif +0 -0
  32. data/lib/public/images/tree/expandable-last.png +0 -0
  33. data/lib/public/images/tree/expandable.gif +0 -0
  34. data/lib/public/images/tree/expandable.png +0 -0
  35. data/lib/public/images/tree/folder_add.png +0 -0
  36. data/lib/public/images/tree/folder_delete.png +0 -0
  37. data/lib/public/images/tree/folder_edit.png +0 -0
  38. data/lib/public/images/tree/icons.png +0 -0
  39. data/lib/public/images/tree/leaf-last.gif +0 -0
  40. data/lib/public/images/tree/leaf-last.png +0 -0
  41. data/lib/public/images/tree/leaf.gif +0 -0
  42. data/lib/public/images/tree/leaf.png +0 -0
  43. data/lib/public/images/tree/line_bg.gif +0 -0
  44. data/lib/public/images/tree/line_bg_over.gif +0 -0
  45. data/lib/public/images/tree/line_bg_over_last.gif +0 -0
  46. data/lib/public/images/tree/minus.gif +0 -0
  47. data/lib/public/images/tree/page_add.png +0 -0
  48. data/lib/public/images/tree/page_delete.png +0 -0
  49. data/lib/public/images/tree/page_edit.png +0 -0
  50. data/lib/public/images/tree/plus.gif +0 -0
  51. data/lib/public/images/tree/root.gif +0 -0
  52. data/lib/public/images/tree/spacer.gif +0 -0
  53. data/lib/public/images/tree/spinner.gif +0 -0
  54. data/lib/public/images/tree/tree_line.gif +0 -0
  55. data/lib/public/javascripts/.DS_Store +0 -0
  56. data/lib/public/javascripts/jquery.simple.tree.js +451 -0
  57. data/lib/public/javascripts/jquery.tiptip.min.js +6 -0
  58. data/lib/public/javascripts/jquery.tree.min.js +1 -0
  59. data/lib/public/javascripts/jstree/jquery.tree.js +2058 -0
  60. data/lib/public/javascripts/themes/mongo3/bg.jpg +0 -0
  61. data/lib/public/javascripts/themes/mongo3/dot_for_ie.gif +0 -0
  62. data/lib/public/javascripts/themes/mongo3/icons.png +0 -0
  63. data/lib/public/javascripts/themes/mongo3/style.css +39 -0
  64. data/lib/public/javascripts/themes/mongo3/throbber.gif +0 -0
  65. data/lib/public/stylesheets/mongo3.css +201 -65
  66. data/lib/views/collections/_fields_form.erb +1 -1
  67. data/lib/views/collections/_index_form.erb +1 -1
  68. data/lib/views/collections/_index_rows.erb +40 -15
  69. data/lib/views/collections/_nodes.erb +0 -0
  70. data/lib/views/collections/_results.erb +4 -4
  71. data/lib/views/collections/{_rows.erb → _rows_table.erb} +11 -9
  72. data/lib/views/collections/_rows_tree.erb +81 -0
  73. data/lib/views/collections/_search_form.erb +1 -1
  74. data/lib/views/collections/blee.erb +20 -0
  75. data/lib/views/collections/list.erb +1 -1
  76. data/lib/views/collections/update.js.erb +1 -1
  77. data/lib/views/databases/_results.erb +9 -7
  78. data/lib/views/explore/_node_info.erb +21 -4
  79. data/lib/views/explore/explore.erb +11 -1
  80. data/lib/views/explore/load_collection.js.erb +1 -0
  81. data/lib/views/explore/load_database.js.erb +1 -0
  82. data/lib/views/layout.erb +13 -7
  83. data/lib/views/users/_results.erb +2 -2
  84. data/spec/configs/crap.yml +20 -0
  85. data/spec/configs/hosed.yml +4 -0
  86. data/spec/configs/landscape.yml +9 -0
  87. data/spec/mongo3/connection_spec.rb +105 -12
  88. data/spec/mongo3/node_spec.rb +38 -0
  89. data/spec/mongo3/user_spec.rb +72 -0
  90. data/spec/mongo3/zone_spec.rb +69 -0
  91. data/spec/mongo3_spec.rb +20 -0
  92. data/spec/spec_helper.rb +13 -0
  93. data/tasks/setup.rb +1 -1
  94. metadata +71 -6
  95. data/spec/landscape.yml +0 -3
@@ -4,7 +4,7 @@
4
4
  <fieldset>
5
5
  <input id="search" type="text" name="search" class="search" value="<%=@query%>"/>
6
6
  <button type="submit" id="submit_button" class="button search" style="display:none">search</button>
7
- <img id="search_load" src="/images/loading.gif" style="width:25px;height:25px;vertical-align:sub;display:none"></img>
7
+ <img id="search_load" src="/images/loading.gif" style="width:25px;height:25px;vertical-align:sub;display:none"/>
8
8
  </fieldset>
9
9
  </form>
10
10
 
@@ -0,0 +1,20 @@
1
+ <div class="borders" style="padding:10px;font-size:0.4em">
2
+ <div id="tree">
3
+ <ul>
4
+ <li id="phtml_1" class="open"><a href="#"><ins> </ins>Root node 1</a>
5
+ <ul>
6
+ <li id="phtml_2"><a href="#"><ins> </ins>Child node 1</a></li>
7
+ <li id="phtml_3"><a href="#"><ins> </ins>Child node 2</a></li>
8
+ <li id="phtml_4"><a href="#"><ins> </ins>Some other child node with longer text</a></li>
9
+ </ul>
10
+ </li>
11
+ <li id="phtml_5"><a href="#"><ins> </ins>Root node 2</a></li>
12
+ </ul>
13
+ </div>
14
+ </div>
15
+
16
+ <script>
17
+ $( function() {
18
+ $('div#tree').tree( { ui: { theme_name: 'apple', theme_path: '/javascripts/themes/apple/style.css'} });
19
+ });
20
+ </script>
@@ -6,7 +6,7 @@
6
6
  <div class="title"><%=title_for( session[:path_names] )%></div>
7
7
 
8
8
  <div id="mgmt_actions">
9
- <img id="action_load" src="/images/loading.gif" style="width:25px;height:25px;vertical-align:sub;display:none"></img>
9
+ <img id="action_load" src="/images/loading.gif" style="width:25px;height:25px;vertical-align:sub;display:none"/>
10
10
  <button class="action clear" rel="#confirm_clear" title="Delete all records from collection">clear</button>
11
11
  <button class="action drop" rel="#confirm_drop" title="Drop the entire collection">drop</button>
12
12
  </div>
@@ -1,3 +1,3 @@
1
1
  <%= erb :'shared/flash.js', :layout => false %>
2
2
 
3
- $('div.table').html( "<%=escape_javascript(partial(:'collections/rows'))%>" );
3
+ $('div.table').html( "<%=escape_javascript(partial(:'collections/rows_tree'))%>" );
@@ -6,18 +6,20 @@
6
6
  <div class="borders" style="padding:10px">
7
7
  <table id="cltn" class="cltn" border="0" cellpadding="10" cellspacing="20">
8
8
  <thead>
9
- <th width="2%">&nbsp;</th>
10
- <% cols = @cltns.first.keys %>
11
- <% cols.each do |col| %>
12
- <th align="<%=align_for( @cltns.first[col] )%>"><%=col%></th>
13
- <% end %>
9
+ <tr>
10
+ <th width="3%">&nbsp;</th>
11
+ <% cols = @cltns.first.keys %>
12
+ <% cols.each do |col| %>
13
+ <th align="<%=align_for( @cltns.first[col] )%>"><%=col%></th>
14
+ <% end %>
15
+ </tr>
14
16
  </thead>
15
17
  <tbody>
16
18
  <% count = 0; @cltns.each do |cltn| %>
17
19
  <tr id="<%=count%>" valign="top">
18
20
  <td id="<%=count%>">
19
21
  <img rel="div#confirm_drop" class="drop" id="<%=cltn[:name]%>" rel="<%=count%>" src="/images/delete.png" title="drop this collection" style="display:none"/>
20
- <img class="wait" id="wait_<%=count%>" src="/images/loading.gif"></img>
22
+ <img class="wait" id="wait_<%=count%>" src="/images/loading.gif"/>
21
23
  </td>
22
24
  <td><a href="/databases/collection/<%=cltn[:name]%>/"><%= cltn[:name] %></a></td>
23
25
  <td align="<%=align_for( cltn[:count] )%>"><%= format_number(cltn[:count]) %></td>
@@ -43,7 +45,7 @@
43
45
 
44
46
  <script>
45
47
  $( function() {
46
- $("table#cltn tr" ).hover(
48
+ $("table#cltn tbody tr" ).hover(
47
49
  function() {
48
50
  $(this).addClass( 'highlight' );
49
51
  $("td#" + $(this).attr('id') + " img.drop" ).show();
@@ -25,9 +25,16 @@
25
25
  <% unless zone_path?( session[:path_names] ) %>
26
26
  <img id="<%=count%>" rel="div#confirm_drop" class="drop" href="/explore/database/<%=node.oid%>/<%=node.name%>/drop" title="drop <%=legend%>..." src="/images/delete.png"/>
27
27
  <% end %>
28
- <p rel="div#details" href="/explore/show/<%=CGI.escape(node.data[:path_ids])%>/<%=CGI.escape(node.data[:path_names])%>" class="info">
29
- <%=truncate(node.name, 30)%>
30
- </p>
28
+ <% if zone_path?( session[:path_names] ) %>
29
+ <p rel="#details" href="/explore/info/<%=CGI.escape(node.data[:path_ids])%>/<%=CGI.escape(node.data[:path_names])%>" class="info" title="<%=node.name%>">
30
+ <%=truncate(node.name, 30)%>
31
+ </p>
32
+ <% else %>
33
+ <p href="/explore/show/<%=CGI.escape(node.data[:path_ids])%>/<%=CGI.escape(node.data[:path_names])%>" class="show" title="<%=node.name%>">
34
+ <%=truncate(node.name, 30)%>
35
+ </p>
36
+ <img class="info" rel="#details" id="<%=count%>" href="/explore/info/<%=CGI.escape(node.data[:path_ids])%>/<%=CGI.escape(node.data[:path_names])%>" title="info for <%=legend%>..." src="/images/information.png"/>
37
+ <% end %>
31
38
  </div>
32
39
  <% count+=1; end %>
33
40
  </div>
@@ -43,6 +50,8 @@
43
50
 
44
51
  <script>
45
52
  $( function() {
53
+ $( ".[title]").tipTip( {maxWidth:'auto', edgeOffset:5} );
54
+
46
55
  $("div.scrollable").scrollable({
47
56
  vertical:true,
48
57
  size: 13,
@@ -80,7 +89,15 @@
80
89
  });
81
90
  });
82
91
 
83
- $('div.item p[rel]').overlay( {
92
+ $('div.item p.show').click( function() {
93
+ $.ajax( {
94
+ dataType: 'script',
95
+ type: 'get',
96
+ url: $(this).attr('href') } );
97
+ return false;
98
+ });
99
+
100
+ $('div.item .info[rel]').overlay( {
84
101
  top: '15%',
85
102
  expose: '#1c1c1c',
86
103
  onBeforeLoad: function() {
@@ -90,6 +90,11 @@
90
90
  onCreateLabel: function(domElement, node){
91
91
  domElement.innerHTML = truncate( unescape(node.name), 15 );
92
92
 
93
+ $(domElement).attr('title', node.name );
94
+ $(domElement).css('z-index', 10 );
95
+ $(domElement).tipTip( {maxWidth:'auto', edgeOffset:5} );
96
+
97
+
93
98
  addEvent(domElement, 'click', function () {
94
99
  var children_count = 0;
95
100
  for( var i in node.adjacencies )
@@ -128,7 +133,12 @@
128
133
  } });
129
134
  }
130
135
  else {
131
- Log.write( "no more data" );
136
+ Log.write( "loading collection..." );
137
+ $.ajax( {
138
+ dataType: 'script',
139
+ type: 'GET',
140
+ url: "/explore/show/" + escape(node.data.path_ids) + "/" + escape(node.data.path_names)
141
+ });
132
142
  }
133
143
  }
134
144
  });
@@ -0,0 +1 @@
1
+ window.location = "/collections/1";
@@ -0,0 +1 @@
1
+ window.location = "/databases/1";
data/lib/views/layout.erb CHANGED
@@ -3,24 +3,30 @@
3
3
  <head>
4
4
  <title>M O N G O 3</title>
5
5
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6
- <link rel="icon" href="/favicon.ico" type="image/x-icon"/>
7
- <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"/>
6
+ <link rel="icon" href="/images/favicon.png" type="image/x-icon"/>
7
+ <link rel="shortcut icon" href="/images/favicon.png" type="image/x-icon"/>
8
8
  <%= stylesheets %w[mongo3] %>
9
- <%= javascripts %w[jquery_min jquery_ui_min jquery.tools.min application jit.min] %>
9
+ <%= javascripts %w[jquery_min jquery_ui_min jquery.tools.min application jit.min jquery.tree.min jquery.tiptip.min] %>
10
10
  </head>
11
11
 
12
12
  <body id="body">
13
13
  <div id="overall">
14
14
  <div id="logo">
15
15
  <a href="/explore" style="float:left">
16
- <img src='/images/mongo3.png' style="border:none"/>
17
- <span id="version"><%=Mongo3.version%></span>
16
+ <img id="logo" src='/images/mongo3.png'/>
17
+ <div id="version"><%=Mongo3.version%></div>
18
18
  </a>
19
- <div class="flash">Hello World</div>
19
+ <div class="flash"></div>
20
20
  </div>
21
21
  <div id="main">
22
22
  <%= yield %>
23
23
  </div>
24
24
  </div>
25
25
  </body>
26
- </html>
26
+ </html>
27
+
28
+ <script>
29
+ $( function() {
30
+ $( "[title]").tipTip( {maxWidth:'auto', edgeOffset:5} );
31
+ });
32
+ </script>
@@ -8,7 +8,7 @@
8
8
  <div class="borders" style="padding:10px">
9
9
  <table id="cltn" class="cltn" border="0" cellpadding="10" cellspacing="20">
10
10
  <thead>
11
- <th width="2%">&nbsp;</th>
11
+ <th width="3%">&nbsp;</th>
12
12
  <th>Id</th>
13
13
  <th>Name</th>
14
14
  </thead>
@@ -43,7 +43,7 @@
43
43
 
44
44
  <script>
45
45
  $( function() {
46
- $("table#cltn tr" ).hover(
46
+ $("table#cltn tbody tr" ).hover(
47
47
  function() {
48
48
  $(this).addClass( 'highlight' );
49
49
  $("td#" + $(this).attr('id') + " img.drop" ).show();
@@ -0,0 +1,20 @@
1
+ test1:
2
+ host: nowhere
3
+ port: 12345
4
+
5
+ test2:
6
+ host: localhost
7
+ port: 007
8
+ user: "admin"
9
+ password: "admin"
10
+
11
+ nowhere:
12
+ host: funky_town
13
+ port: 007
14
+
15
+ bozo:
16
+ more_crap: 10
17
+
18
+ blee:
19
+ host: nowhere
20
+ portola: 10
@@ -0,0 +1,4 @@
1
+ crap:
2
+
3
+
4
+ shit:
@@ -0,0 +1,9 @@
1
+ test:
2
+ host: localhost
3
+ port: 12345
4
+
5
+ admin:
6
+ host: localhost
7
+ port: 12345
8
+ user: "admin"
9
+ password: "admin"
@@ -7,7 +7,7 @@ describe Mongo3::Connection do
7
7
  before( :all ) do
8
8
  @con = Mongo::Connection.new( 'localhost', 12345 )
9
9
  @db = @con.db( 'mongo3_test_db', :strict => true )
10
- @mongo3 = Mongo3::Connection.new( File.join(File.dirname(__FILE__), %w[.. landscape.yml]) )
10
+ @mongo3 = Mongo3::Connection.new( File.join(File.dirname(__FILE__), %w[.. configs landscape.yml]) )
11
11
  end
12
12
 
13
13
  before( :each ) do
@@ -31,6 +31,63 @@ describe Mongo3::Connection do
31
31
  @cltn2.insert( {:name => "test_#{i}", :value => i } )
32
32
  end
33
33
  end
34
+
35
+ describe "configs" do
36
+ before( :all ) do
37
+ @crapola = Mongo3::Connection.new( File.join(File.dirname(__FILE__), %w[.. configs crap.yml]) )
38
+ end
39
+
40
+ it "should raise an error on bogus yml" do
41
+ lambda {
42
+ con = Mongo3::Connection.new( File.join(File.dirname(__FILE__), %w[.. configs hosed.yml]) )
43
+ con.send( :config )
44
+ }.should raise_error( /Unable to grok yaml landscape file/ )
45
+ end
46
+
47
+ it "should crap out if the zone host is missing correctly" do
48
+ lambda {
49
+ @crapola.send( :connect_for, "bozo" )
50
+ }.should raise_error( /Unable to find `host/ )
51
+ end
52
+
53
+ it "should crap out if the zone port is missing correctly" do
54
+ lambda {
55
+ @crapola.send( :connect_for, "blee" )
56
+ }.should raise_error( /Unable to find `port/ )
57
+ end
58
+
59
+ it "should crap out if the zone is not correctly configured" do
60
+ lambda {
61
+ @crapola.send( :connect_for, "nowhere" )
62
+ }.should raise_error( /MongoDB connection failed for `"funky_town"/ )
63
+ end
64
+ end
65
+
66
+ describe "zones" do
67
+ it "should crap out if the zone does not exist" do
68
+ lambda {
69
+ @mongo3.send( :connect_for, "shit for brains" )
70
+ }.should raise_error( /Unable to find zone/ )
71
+ end
72
+
73
+ it "should connect to a zone with auth correctly" do
74
+ @mongo3.send( :connect_for, "admin" ) do |con|
75
+ con.should_not be_nil
76
+ end
77
+ end
78
+ end
79
+
80
+ describe "drop database" do
81
+ it "should drop a database correctly" do
82
+ dbs = @con.database_names
83
+ # Quirk? a db does not really exists unless it has a collection
84
+ db = @con.db( "dead_meat" )
85
+ db.create_collection( "dead_weight" )
86
+ @con.database_names.should have( dbs.size + 1 ).items
87
+ @mongo3.drop_db( "home|test|dead_meat" )
88
+ @con.database_names.should have( dbs.size ).items
89
+ end
90
+ end
34
91
 
35
92
  it "should clear out a cltn correctly" do
36
93
  @mongo3.clear_cltn( "home|test|mongo3_test_db|test1_cltn" )
@@ -49,13 +106,7 @@ describe Mongo3::Connection do
49
106
  @mongo3.drop_cltn( "home|test|mongo3_test_db|test1_cltn" )
50
107
  lambda { @db['test1_cltn'] }.should raise_error( /Collection test1_cltn/ )
51
108
  end
52
-
53
- it "should drop a db correctly" do
54
- @mongo3.drop_db( "home|test|mongo3_test_db" )
55
- @con.database_names.include?( 'mongo3_test_db' ).should == false
56
- @db = @con.db( 'mongo3_test_db', :strict => true )
57
- end
58
-
109
+
59
110
  it "should load a landscape file correctly" do
60
111
  test = @mongo3.landscape['test']
61
112
 
@@ -72,10 +123,13 @@ describe Mongo3::Connection do
72
123
  root.data[:path_names].should == 'home'
73
124
 
74
125
  children = root.children
75
- children.should have(1).item
76
- children.first.name.should == 'test'
77
- children.first.oid.should == 'test'
78
- children.first.children.should be_empty
126
+ children.should have(2).item
127
+ children.first.name.should == 'admin'
128
+
129
+ test = children.last
130
+ test.name.should == 'test'
131
+ test.oid.should == 'test'
132
+ test.children.should be_empty
79
133
  end
80
134
 
81
135
  describe "#show" do
@@ -144,8 +198,31 @@ describe Mongo3::Connection do
144
198
  rows.size.should == 4
145
199
  rows.total_entries.should == 4
146
200
  end
201
+
202
+ it "should paginate db with regex q correctly" do
203
+ pending do
204
+ rows = @mongo3.paginate_cltn( "home|test|mongo3_test_db|test1_cltn", [{"name"=>"\/test_*\/", "value"=>{"$gt"=>5}}, []] )
205
+ rows.size.should == 4
206
+ rows.total_entries.should == 4
207
+ end
208
+ end
209
+
147
210
  end
148
211
 
212
+ describe "slaves" do
213
+ it "should differentiate with a zone path" do
214
+ @mongo3.send( :slave_zone?, %w[home test] ).should == false
215
+ end
216
+
217
+ it "should differentiate with a db path" do
218
+ @mongo3.send( :slave_zone?, %w[home test fred] ).should == false
219
+ end
220
+
221
+ it "should detect a slave zone correctly" do
222
+ @mongo3.send( :slave_zone?, %w[home test test] ).should == true
223
+ end
224
+ end
225
+
149
226
  describe "indexes" do
150
227
  it "should list indexes correctly" do
151
228
  indexes = @mongo3.indexes_for( "home|test|mongo3_test_db|test1_cltn" )
@@ -178,4 +255,20 @@ describe Mongo3::Connection do
178
255
  indexes.size.should == before - 1
179
256
  end
180
257
  end
258
+
259
+ it "should detect a collection correctly" do
260
+ @mongo3.send( :cltn_request?, %w[blee duh] ).should == false
261
+ @mongo3.send( :cltn_request?, %w[blee duh fred] ).should == true
262
+ end
263
+
264
+ describe "#zone_for" do
265
+ it "should find a zone correctly" do
266
+ @mongo3.send( :zone_for, "localhost", "12345" ).should == "admin"
267
+ end
268
+
269
+ it "should fail if a zone does not exist" do
270
+ @mongo3.send( :zone_for, "ghost", 27017 ).should be_nil
271
+ @mongo3.send( :zone_for, "localhost", 8888 ).should be_nil
272
+ end
273
+ end
181
274
  end
@@ -99,4 +99,42 @@ describe Mongo3::Node do
99
99
  # @dbs.first.to_adjacencies.should ==
100
100
  # [{:adjacencies=>[102, 103, 104, 105], :name=>"db_0", :id=>102, :data=>{:path_ids=>"0|100|102", :path_names=>"root|env_0|db_0"}}, {:adjacencies=>[], :name=>"cltn_0", :id=>102, :data=>{:path_ids=>"0|100|102|102", :path_names=>"root|env_0|db_0|cltn_0"}}, {:adjacencies=>[], :name=>"cltn_1", :id=>103, :data=>{:path_ids=>"0|100|102|103", :path_names=>"root|env_0|db_0|cltn_1"}}, {:adjacencies=>[], :name=>"cltn_2", :id=>104, :data=>{:path_ids=>"0|100|102|104", :path_names=>"root|env_0|db_0|cltn_2"}}, {:adjacencies=>[], :name=>"cltn_3", :id=>105, :data=>{:path_ids=>"0|100|102|105", :path_names=>"root|env_0|db_0|cltn_3"}}]
101
101
  end
102
+
103
+ describe "slave node" do
104
+ before :all do
105
+ @node = Mongo3::Node.make_node( "fred" )
106
+ end
107
+
108
+ it "should mark a slave node correctly" do
109
+ @node.mark_slave!
110
+ @node.data.has_key?( :master ).should == false
111
+ @node.data[:slave].should == true
112
+ @node.data['$dim'].should == 15
113
+ @node.data['$lineWidth'].should == 3
114
+ @node.data['$color'].should == "#434343"
115
+ end
116
+
117
+ it "should detect a slave node correctly" do
118
+ @node.should be_slave
119
+ end
120
+ end
121
+
122
+ describe "master node" do
123
+ before :all do
124
+ @node = Mongo3::Node.make_node( "fred" )
125
+ end
126
+
127
+ it "should mark a master not correctly" do
128
+ @node.mark_master!
129
+ @node.data.has_key?( :slave ).should == false
130
+ @node.data[:master].should == true
131
+ @node.data['$dim'].should == 15
132
+ @node.data['$lineWidth'].should == 3
133
+ @node.data['$color'].should == "#92b948"
134
+ end
135
+
136
+ it "should detect a master node correctly" do
137
+ @node.should be_master
138
+ end
139
+ end
102
140
  end
@@ -0,0 +1,72 @@
1
+ require File.expand_path( File.join( File.dirname(__FILE__), %w[.. spec_helper] ) )
2
+ require 'ostruct'
3
+ require 'mongo'
4
+
5
+ describe Mongo3::User do
6
+
7
+ before( :each ) do
8
+ @users = Mongo3::User.new( File.join(File.dirname(__FILE__), %w[.. configs landscape.yml] ) )
9
+ @users.clear!( "home|test" )
10
+ @users.list( "home|test", 1 ).should have(0).items
11
+ end
12
+
13
+ describe "#add" do
14
+ it "should add users correctly" do
15
+ result = @users.add( "home|test", "fred", "blee" )
16
+ result.should_not be_nil
17
+ @users.list( "home|test", 1 ).should have(1).item
18
+ end
19
+
20
+ it "should crap out if a user exists" do
21
+ result = @users.add( "home|test", "fred", "blee" )
22
+ result.should_not be_nil
23
+ @users.list( "home|test", 1 ).should have(1).item
24
+ lambda {
25
+ @users.add( "home|test", "fred", "blee" )
26
+ }.should raise_error( /User fred already exists!/ )
27
+ end
28
+ end
29
+
30
+ it "should clear out users correctly" do
31
+ 10.times { |i| @users.add( "home|test", "fred_#{i}", "secret" ) }
32
+ @users.list( "home|test", 1 ).should have(10).items
33
+ @users.clear!( "home|test" )
34
+ @users.list( "home|test", 1 ).should have(0).item
35
+ end
36
+
37
+ describe "#delete" do
38
+ it "should delete a user correctly" do
39
+ user_ids = []
40
+ 10.times { |i| user_ids << @users.add( "home|test", "fred_#{i}", "secret" ) }
41
+
42
+ count = 1
43
+ user_ids.each do |id|
44
+ result = @users.delete( "home|test", id.to_s )
45
+ result.should_not be_nil
46
+ @users.list( "home|test", 1 ).should have(10-count).items
47
+ count += 1
48
+ end
49
+ end
50
+ end
51
+
52
+ describe "#list" do
53
+ it "should list users correctly" do
54
+ users = @users.list( "home|test", 1 )
55
+ users.should have(0).items
56
+ end
57
+
58
+ it "should paginate users correctly" do
59
+ 10.times { |i| @users.add( "home|test", "fred_#{i}", "secret" ) }
60
+ users = @users.list( "home|test", 1, 2 )
61
+ users.should have(2).items
62
+ users.total_pages.should == 5
63
+ users.total_entries.should == 10
64
+ end
65
+ end
66
+
67
+ it "it should rename a user correctly" do
68
+ pending do
69
+ @users.rename( "home|test", "fred", "blee" )
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,69 @@
1
+ require File.expand_path( File.join( File.dirname(__FILE__), %w[.. spec_helper] ) )
2
+ require 'ostruct'
3
+ require 'mongo'
4
+
5
+ describe Mongo3::Zone do
6
+
7
+ before( :each ) do
8
+ @zones = Mongo3::Zone.new( File.join(File.dirname(__FILE__), %w[.. configs landscape.yml] ) )
9
+ end
10
+
11
+ describe "#connect_for" do
12
+ it "should connect to a zone correctly" do
13
+ @zones.send( :connect_for, "home|test" ) do |con|
14
+ con.should_not be_nil
15
+ end
16
+ end
17
+
18
+ it "should connect to an admin zone correctly" do
19
+ @zones.send( :connect_for, "home|admin" ) do |con|
20
+ con.should_not be_nil
21
+ end
22
+ end
23
+ end
24
+
25
+ describe "#zone_for" do
26
+ it "should find a zone correctly" do
27
+ @zones.send( :zone_for, "localhost", "12345" ).should == "admin"
28
+ end
29
+
30
+ it "should fail if a zone does not exist" do
31
+ @zones.send( :zone_for, "ghost", 27017 ).should be_nil
32
+ @zones.send( :zone_for, "localhost", 8888 ).should be_nil
33
+ end
34
+ end
35
+
36
+ describe "configs" do
37
+ before( :all ) do
38
+ @crapola = Mongo3::Zone.new( File.join(File.dirname(__FILE__), %w[.. configs crap.yml]) )
39
+ end
40
+
41
+ it "should raise an error on bogus yml" do
42
+ lambda {
43
+ con = Mongo3::Zone.new( File.join(File.dirname(__FILE__), %w[.. configs hosed.yml]) )
44
+ con.send( :config )
45
+ }.should raise_error( /Unable to grok yaml landscape file/ )
46
+ end
47
+
48
+ it "should crap out if the zone host is missing correctly" do
49
+ lambda {
50
+ @crapola.send( :connect_for, "home|bozo" )
51
+ }.should raise_error( /Unable to find `host/ )
52
+ end
53
+
54
+ it "should crap out if the zone port is missing correctly" do
55
+ lambda {
56
+ @crapola.send( :connect_for, "home|blee" )
57
+ }.should raise_error( /Unable to find `port/ )
58
+ end
59
+
60
+ it "should crap out if the zone is not correctly configured" do
61
+ lambda {
62
+ @crapola.send( :connect_for, "home|nowhere" )
63
+ }.should raise_error( /MongoDB connection failed for `funky_town/ )
64
+ end
65
+
66
+ end
67
+
68
+ end
69
+
@@ -0,0 +1,20 @@
1
+ require File.join(File.dirname(__FILE__), %w[spec_helper])
2
+
3
+ describe Mongo3 do
4
+ before( :all ) do
5
+ @root = ::File.expand_path( ::File.join(::File.dirname(__FILE__), ".." ) )
6
+ end
7
+
8
+ it "is versioned" do
9
+ Mongo3.version.should =~ /\d+\.\d+\.\d+/
10
+ end
11
+
12
+ it "generates a correct path relative to root" do
13
+ Mongo3.path( "mongo3.rb" ).should == ::File.join(@root, "mongo3.rb" )
14
+ end
15
+
16
+ it "generates a correct path relative to lib" do
17
+ Mongo3.libpath(%w[ mongo3 node.rb]).should == ::File.join( @root, "lib", "mongo3", "node.rb" )
18
+ end
19
+
20
+ end
data/spec/spec_helper.rb CHANGED
@@ -7,5 +7,18 @@ require 'will_paginate/collection'
7
7
 
8
8
  require File.expand_path( File.join( File.dirname(__FILE__), %w[.. lib mongo3] ) )
9
9
 
10
+ begin
11
+ Mongo::Connection.new( 'localhost', 12345 )
12
+ rescue => boom
13
+ puts "\n"*3
14
+ puts "<OH SNAP!!>"
15
+ puts ""
16
+ puts "To run the tests you need to a local instance of mongodb on port 12345"
17
+ puts ""
18
+ puts "> mongodb --dbpath /data/db/mongo3 --port 12345"
19
+ puts "\n"*3
20
+ raise "Bailing out"
21
+ end
22
+
10
23
  Spec::Runner.configure do |config|
11
24
  end
data/tasks/setup.rb CHANGED
@@ -21,7 +21,7 @@ PROJ = OpenStruct.new(
21
21
  :email => nil,
22
22
  :url => "\000",
23
23
  :version => ENV['VERSION'] || '0.0.0',
24
- :exclude => %w(tmp$ bak$ ~$ CVS \.svn/ \.git/ ^pkg/),
24
+ :exclude => %w(tmp$ bak$ ~$ CVS \.svn/ \.git/ ^pkg/ exps/* \.psd ),
25
25
  :release_name => ENV['RELEASE'],
26
26
 
27
27
  # System Defaults