rails_db_admin 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/GPL-3-LICENSE +674 -0
- data/README.md +5 -0
- data/Rakefile +30 -0
- data/app/assets/javascripts/rails_db_admin/application.js +9 -0
- data/app/assets/stylesheets/rails_db_admin/application.css +7 -0
- data/app/controllers/rails_db_admin/erp_app/desktop/base_controller.rb +182 -0
- data/app/controllers/rails_db_admin/erp_app/desktop/queries_controller.rb +173 -0
- data/app/helpers/rails_db_admin/application_helper.rb +4 -0
- data/app/views/layouts/application.html.erb +14 -0
- data/app/views/layouts/rails_db_admin/application.html.erb +14 -0
- data/config/initializers/rails_db_admin.rb +4 -0
- data/config/routes.rb +4 -0
- data/db/data_migrations/20110816005525_rails_db_admin_application.rb +31 -0
- data/lib/rails_db_admin.rb +15 -0
- data/lib/rails_db_admin/config.rb +27 -0
- data/lib/rails_db_admin/connection_handler.rb +17 -0
- data/lib/rails_db_admin/engine.rb +11 -0
- data/lib/rails_db_admin/extjs.rb +2 -0
- data/lib/rails_db_admin/extjs/json_column_builder.rb +139 -0
- data/lib/rails_db_admin/extjs/json_data_builder.rb +82 -0
- data/lib/rails_db_admin/query_support.rb +72 -0
- data/lib/rails_db_admin/table_support.rb +147 -0
- data/lib/rails_db_admin/version.rb +3 -0
- data/lib/tasks/rails_db_admin_tasks.rake +4 -0
- data/public/images/icons/rails_db_admin/rails_db_admin_16x16.png +0 -0
- data/public/images/icons/rails_db_admin/rails_db_admin_24x24.png +0 -0
- data/public/images/icons/rails_db_admin/rails_db_admin_32x32.png +0 -0
- data/public/images/icons/rails_db_admin/rails_db_admin_48x48.png +0 -0
- data/public/javascripts/erp_app/desktop/applications/rails_db_admin/database_combo.js +52 -0
- data/public/javascripts/erp_app/desktop/applications/rails_db_admin/module.js +429 -0
- data/public/javascripts/erp_app/desktop/applications/rails_db_admin/queries_tree_menu.js +86 -0
- data/public/javascripts/erp_app/desktop/applications/rails_db_admin/query_panel.js +206 -0
- data/public/javascripts/erp_app/desktop/applications/rails_db_admin/readonly_table_data_grid.js +27 -0
- data/public/javascripts/erp_app/desktop/applications/rails_db_admin/tables_tree_menu.js +87 -0
- data/public/stylesheets/erp_app/desktop/applications/rails_db_admin/rails_db_admin.css +10 -0
- data/spec/controllers/rails_db_admin/base_controller_spec.rb +481 -0
- data/spec/controllers/rails_db_admin/queries_controller_spec.rb +134 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +9 -0
- data/spec/dummy/app/assets/stylesheets/application.css +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +45 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +14 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/cucumber.rb +3 -0
- data/spec/dummy/config/environments/spec.rb +27 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +5 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/lib/rails_db_admin/extjs/json_column_builder_spec.rb +206 -0
- data/spec/lib/rails_db_admin/extjs/json_data_builder_spec.rb +201 -0
- data/spec/lib/rails_db_admin/query_support_spec.rb +40 -0
- data/spec/lib/rails_db_admin/table_support_spec.rb +349 -0
- data/spec/spec_helper.rb +60 -0
- metadata +183 -0
@@ -0,0 +1,86 @@
|
|
1
|
+
Ext.define("Compass.ErpApp.Desktop.Applications.RailsDbAdmin.QueriesMenuTreePanel",{
|
2
|
+
extend:"Ext.tree.TreePanel",
|
3
|
+
alias:'widget.railsdbadmin_queriestreemenu',
|
4
|
+
|
5
|
+
constructor : function(config) {
|
6
|
+
var self = this;
|
7
|
+
|
8
|
+
config = Ext.apply({
|
9
|
+
title:'Queries',
|
10
|
+
autoScroll:true,
|
11
|
+
store:Ext.create('Ext.data.TreeStore', {
|
12
|
+
proxy: {
|
13
|
+
type: 'ajax',
|
14
|
+
url: '/rails_db_admin/erp_app/desktop/queries/saved_queries_tree'
|
15
|
+
},
|
16
|
+
root:{
|
17
|
+
text: 'Queries',
|
18
|
+
expanded: true,
|
19
|
+
draggable:false,
|
20
|
+
iconCls:'icon-content'
|
21
|
+
}
|
22
|
+
}),
|
23
|
+
animate:false,
|
24
|
+
//TODO_EXTJS4 this is added to fix error should be removed when extjs 4 releases fix.
|
25
|
+
viewConfig:{
|
26
|
+
loadMask: false
|
27
|
+
},
|
28
|
+
listeners:{
|
29
|
+
'itemclick':function(view, record, item, index, e){
|
30
|
+
e.stopEvent();
|
31
|
+
if(record.data.leaf){
|
32
|
+
self.initialConfig.module.displayQuery(record.data.id);
|
33
|
+
}
|
34
|
+
},
|
35
|
+
'itemcontextmenu':function(view, record, item, index, e){
|
36
|
+
e.stopEvent();
|
37
|
+
var contextMenu = null;
|
38
|
+
if(record.data.leaf){
|
39
|
+
contextMenu = new Ext.menu.Menu({
|
40
|
+
items:[
|
41
|
+
{
|
42
|
+
text:"Execute",
|
43
|
+
iconCls:'icon-settings',
|
44
|
+
listeners:{
|
45
|
+
scope:record,
|
46
|
+
'click':function(){
|
47
|
+
self.initialConfig.module.displayAndExecuteQuery(record.data.id);
|
48
|
+
}
|
49
|
+
}
|
50
|
+
},
|
51
|
+
{
|
52
|
+
text:"Delete",
|
53
|
+
iconCls:'icon-delete',
|
54
|
+
listeners:{
|
55
|
+
scope:record,
|
56
|
+
'click':function(){
|
57
|
+
self.initialConfig.module.deleteQuery(record.data.id);
|
58
|
+
}
|
59
|
+
}
|
60
|
+
}
|
61
|
+
]
|
62
|
+
});
|
63
|
+
}
|
64
|
+
else{
|
65
|
+
contextMenu = new Ext.menu.Menu({
|
66
|
+
items:[
|
67
|
+
{
|
68
|
+
text:"New Query",
|
69
|
+
iconCls:'icon-new',
|
70
|
+
listeners:{
|
71
|
+
'click':function(){
|
72
|
+
self.initialConfig.module.addNewQueryTab();
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
76
|
+
]
|
77
|
+
});
|
78
|
+
}
|
79
|
+
contextMenu.showAt(e.xy);
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}, config);
|
83
|
+
|
84
|
+
this.callParent([config]);
|
85
|
+
}
|
86
|
+
});
|
@@ -0,0 +1,206 @@
|
|
1
|
+
Ext.define("Compass.ErpApp.Desktop.Applications.RailsDbAdmin.QueryPanel",{
|
2
|
+
extend:"Ext.Panel",
|
3
|
+
alias:'widget.railsdbadmin_querypanel',
|
4
|
+
gridContainer : null,
|
5
|
+
initComponent: function() {
|
6
|
+
var self = this;
|
7
|
+
var messageBox = null;
|
8
|
+
|
9
|
+
var savedQueriesJsonStore = Ext.create('Ext.data.Store', {
|
10
|
+
proxy: {
|
11
|
+
type: 'ajax',
|
12
|
+
url: '/rails_db_admin/erp_app/desktop/queries/saved_queries',
|
13
|
+
reader: {
|
14
|
+
type: 'json',
|
15
|
+
root: 'data'
|
16
|
+
}
|
17
|
+
},
|
18
|
+
fields:[
|
19
|
+
{
|
20
|
+
name:'value'
|
21
|
+
},
|
22
|
+
{
|
23
|
+
name:'display'
|
24
|
+
}
|
25
|
+
]
|
26
|
+
});
|
27
|
+
|
28
|
+
var tableGridContainer = new Ext.Panel({
|
29
|
+
layout:'card',
|
30
|
+
region : 'center',
|
31
|
+
margins : '0 0 0 0',
|
32
|
+
autoScroll:true,
|
33
|
+
items:[]
|
34
|
+
});
|
35
|
+
|
36
|
+
this.gridContainer = tableGridContainer;
|
37
|
+
|
38
|
+
var codeMirrorPanel = new Ext.Panel({
|
39
|
+
height:250,
|
40
|
+
region:'north',
|
41
|
+
margins : '0 0 0 0',
|
42
|
+
frame:false,
|
43
|
+
border:false,
|
44
|
+
autoScroll:true,
|
45
|
+
layout:'fit',
|
46
|
+
items:[
|
47
|
+
{
|
48
|
+
xtype:'codemirror',
|
49
|
+
parser:'sql',
|
50
|
+
sourceCode:this.initialConfig['sqlQuery'],
|
51
|
+
disableSave:true
|
52
|
+
}
|
53
|
+
]
|
54
|
+
|
55
|
+
});
|
56
|
+
|
57
|
+
this.tbar = {
|
58
|
+
items:[{
|
59
|
+
text: 'Execute',
|
60
|
+
iconCls: 'icon-settings',
|
61
|
+
handler: function(button) {
|
62
|
+
var textarea = self.query('.codemirror')[0];
|
63
|
+
var sql = textarea.getValue();
|
64
|
+
var selected_sql = textarea.getSelection();
|
65
|
+
var cursor_pos = textarea.getCursor().line;
|
66
|
+
var database = self.module.getDatabase();
|
67
|
+
|
68
|
+
messageBox = Ext.Msg.wait('Status', 'Executing..');
|
69
|
+
|
70
|
+
var conn = new Ext.data.Connection();
|
71
|
+
conn.request({
|
72
|
+
url: '/rails_db_admin/erp_app/desktop/queries/execute_query',
|
73
|
+
params:{
|
74
|
+
sql:sql,
|
75
|
+
database:database,
|
76
|
+
cursor_pos: cursor_pos,
|
77
|
+
selected_sql : selected_sql
|
78
|
+
},
|
79
|
+
method:'post',
|
80
|
+
success: function(responseObject) {
|
81
|
+
|
82
|
+
messageBox.hide();
|
83
|
+
var response = Ext.decode(responseObject.responseText);
|
84
|
+
|
85
|
+
if(response.success)
|
86
|
+
{
|
87
|
+
var columns = response.columns;
|
88
|
+
var fields = response.fields;
|
89
|
+
var data = response.data;
|
90
|
+
|
91
|
+
var grid = new Compass.ErpApp.Desktop.Applications.RailsDbAdmin.ReadOnlyTableDataGrid({
|
92
|
+
columns:columns,
|
93
|
+
fields:fields,
|
94
|
+
data:data
|
95
|
+
});
|
96
|
+
|
97
|
+
tableGridContainer.removeAll(true);
|
98
|
+
tableGridContainer.add(grid);
|
99
|
+
tableGridContainer.getLayout().setActiveItem(0);
|
100
|
+
}
|
101
|
+
else
|
102
|
+
{
|
103
|
+
Ext.Msg.alert("Error", response.exception);
|
104
|
+
}
|
105
|
+
|
106
|
+
},
|
107
|
+
failure: function() {
|
108
|
+
messageBox.hide();
|
109
|
+
Ext.Msg.alert('Status', 'Error loading grid');
|
110
|
+
}
|
111
|
+
});
|
112
|
+
}
|
113
|
+
},
|
114
|
+
{
|
115
|
+
text: 'Save',
|
116
|
+
iconCls: 'icon-save',
|
117
|
+
handler:function(){
|
118
|
+
var textarea = self.query('.codemirror')[0];
|
119
|
+
var save_window = new Ext.Window({
|
120
|
+
layout:'fit',
|
121
|
+
width:375,
|
122
|
+
title:'Save Query',
|
123
|
+
height:125,
|
124
|
+
buttonAlign:'center',
|
125
|
+
closeAction:'hide',
|
126
|
+
plain: true,
|
127
|
+
items: new Ext.FormPanel({
|
128
|
+
frame:false,
|
129
|
+
bodyStyle:'padding:5px 5px 0',
|
130
|
+
width: 500,
|
131
|
+
items: [{
|
132
|
+
xtype: 'combo',
|
133
|
+
fieldLabel: 'Query Name',
|
134
|
+
name: 'query_name',
|
135
|
+
allowBlank:false,
|
136
|
+
store:savedQueriesJsonStore,
|
137
|
+
valueField:'value',
|
138
|
+
displayField:'display',
|
139
|
+
triggerAction:'all',
|
140
|
+
forceSelection:false,
|
141
|
+
mode:'remote'
|
142
|
+
},
|
143
|
+
{
|
144
|
+
xtype: 'hidden',
|
145
|
+
value: textarea.getValue(),
|
146
|
+
name: 'query'
|
147
|
+
},
|
148
|
+
{
|
149
|
+
xtype: 'hidden',
|
150
|
+
value: self.module.getDatabase(),
|
151
|
+
name: 'database'
|
152
|
+
}]
|
153
|
+
}),
|
154
|
+
buttons: [{
|
155
|
+
text: 'Save',
|
156
|
+
handler: function(){
|
157
|
+
var fp = this.findParentByType('window').query('.form')[0];
|
158
|
+
if(fp.getForm().isValid()){
|
159
|
+
fp.getForm().submit({
|
160
|
+
url: '/rails_db_admin/erp_app/desktop/queries/save_query',
|
161
|
+
waitMsg: 'Saving Query...',
|
162
|
+
success: function(fp, o){
|
163
|
+
Ext.Msg.alert('Success', 'Saved Query');
|
164
|
+
var database = self.module.getDatabase();
|
165
|
+
self.module.queriesTreePanel().store.setProxy({
|
166
|
+
type: 'ajax',
|
167
|
+
url: '/rails_db_admin/erp_app/desktop/queries/saved_queries_tree',
|
168
|
+
extraParams:{
|
169
|
+
database:database
|
170
|
+
}
|
171
|
+
});
|
172
|
+
self.module.queriesTreePanel().store.load();
|
173
|
+
save_window.hide();
|
174
|
+
}
|
175
|
+
});
|
176
|
+
}
|
177
|
+
}
|
178
|
+
},{
|
179
|
+
text: 'Cancel',
|
180
|
+
handler: function(){
|
181
|
+
save_window.hide();
|
182
|
+
}
|
183
|
+
}]
|
184
|
+
|
185
|
+
});
|
186
|
+
save_window.show();
|
187
|
+
}
|
188
|
+
}]
|
189
|
+
};
|
190
|
+
|
191
|
+
this.items = [codeMirrorPanel, tableGridContainer];
|
192
|
+
this.callParent(arguments);
|
193
|
+
},
|
194
|
+
|
195
|
+
constructor : function(config) {
|
196
|
+
config = Ext.apply({
|
197
|
+
title:'Query',
|
198
|
+
layout:'border',
|
199
|
+
autoScroll:true,
|
200
|
+
closable: true,
|
201
|
+
border:false
|
202
|
+
}, config);
|
203
|
+
this.callParent([config]);
|
204
|
+
}
|
205
|
+
|
206
|
+
});
|
data/public/javascripts/erp_app/desktop/applications/rails_db_admin/readonly_table_data_grid.js
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
Ext.define("Compass.ErpApp.Desktop.Applications.RailsDbAdmin.ReadOnlyTableDataGrid",{
|
2
|
+
extend:"Ext.grid.GridPanel",
|
3
|
+
alias:'widget.railsdbadmin_readonlytabledatagrid',
|
4
|
+
constructor : function(config) {
|
5
|
+
var jsonStore = new Ext.data.JsonStore({
|
6
|
+
fields:config.fields,
|
7
|
+
data:config.data
|
8
|
+
})
|
9
|
+
|
10
|
+
config = Ext.apply({
|
11
|
+
store:jsonStore,
|
12
|
+
layout:'fit',
|
13
|
+
frame: false,
|
14
|
+
closable: true,
|
15
|
+
autoScroll:true,
|
16
|
+
region:'center',
|
17
|
+
loadMask:true
|
18
|
+
}, config);
|
19
|
+
|
20
|
+
this.callParent([config]);
|
21
|
+
}
|
22
|
+
});
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
@@ -0,0 +1,87 @@
|
|
1
|
+
Ext.define("Compass.ErpApp.Desktop.Applications.RailsDbAdmin.TablesMenuTreePanel",{
|
2
|
+
extend:"Ext.tree.TreePanel",
|
3
|
+
alias:'widget.railsdbadmin_tablestreemenu',
|
4
|
+
constructor : function(config) {
|
5
|
+
var self = this;
|
6
|
+
|
7
|
+
config = Ext.apply({
|
8
|
+
title:'Tables',
|
9
|
+
autoScroll:true,
|
10
|
+
store:Ext.create('Ext.data.TreeStore', {
|
11
|
+
proxy: {
|
12
|
+
type: 'ajax',
|
13
|
+
url: '/rails_db_admin/erp_app/desktop/base/tables'
|
14
|
+
},
|
15
|
+
root: {
|
16
|
+
text: 'Tables',
|
17
|
+
expanded:false,
|
18
|
+
draggable:false,
|
19
|
+
iconCls:'icon-content'
|
20
|
+
},
|
21
|
+
fields:[
|
22
|
+
{
|
23
|
+
name:'leaf'
|
24
|
+
},
|
25
|
+
|
26
|
+
{
|
27
|
+
name:'iconCls'
|
28
|
+
},
|
29
|
+
|
30
|
+
{
|
31
|
+
name:'text'
|
32
|
+
},
|
33
|
+
|
34
|
+
{
|
35
|
+
name:'id'
|
36
|
+
},
|
37
|
+
|
38
|
+
{
|
39
|
+
name:'isTable'
|
40
|
+
}
|
41
|
+
]
|
42
|
+
}),
|
43
|
+
animate:false,
|
44
|
+
//TODO_EXTJS4 this is added to fix error should be removed when extjs 4 releases fix.
|
45
|
+
viewConfig:{
|
46
|
+
loadMask: false
|
47
|
+
},
|
48
|
+
listeners:{
|
49
|
+
'itemcontextmenu':function(view, record, item, index, e){
|
50
|
+
e.stopEvent();
|
51
|
+
if(!record.data['isTable']){
|
52
|
+
return false;
|
53
|
+
}
|
54
|
+
else{
|
55
|
+
var contextMenu = new Ext.menu.Menu({
|
56
|
+
items:[
|
57
|
+
{
|
58
|
+
text:"Select Top 50",
|
59
|
+
iconCls:'icon-settings',
|
60
|
+
listeners:{
|
61
|
+
scope:record,
|
62
|
+
'click':function(){
|
63
|
+
self.initialConfig.module.selectTopFifty(this.data.id);
|
64
|
+
}
|
65
|
+
}
|
66
|
+
},
|
67
|
+
{
|
68
|
+
text:"Edit Table Data",
|
69
|
+
iconCls:'icon-edit',
|
70
|
+
listeners:{
|
71
|
+
scope:record,
|
72
|
+
'click':function(){
|
73
|
+
self.initialConfig.module.getTableData(this.data.id);
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|
77
|
+
]
|
78
|
+
});
|
79
|
+
contextMenu.showAt(e.xy);
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}
|
83
|
+
}, config);
|
84
|
+
|
85
|
+
this.callParent([config]);
|
86
|
+
}
|
87
|
+
});
|
@@ -0,0 +1,10 @@
|
|
1
|
+
.icon-rails_db_admin {
|
2
|
+
background-image:url( /images/icons/rails_db_admin/rails_db_admin_16x16.png ) !important;
|
3
|
+
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/icons/rails_db_admin/rails_db_admin_16x16.png', sizingMethod='crop');
|
4
|
+
}
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
|
@@ -0,0 +1,481 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe RailsDbAdmin::BaseController do
|
4
|
+
|
5
|
+
#handle devise user auth
|
6
|
+
before(:each) do
|
7
|
+
basic_user_auth
|
8
|
+
end
|
9
|
+
|
10
|
+
before(:all) do
|
11
|
+
Factory.create(:role_type, :internal_identifier => "execute_query_test_role")
|
12
|
+
Factory.create(:role_type, :internal_identifier => "execute_query_test_role_2")
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "POST setup_table_grid" do
|
16
|
+
|
17
|
+
it "should return success:true" do
|
18
|
+
|
19
|
+
post :base, {:use_route => :rails_db_admin,
|
20
|
+
:action => "setup_table_grid",
|
21
|
+
:table => 'role_types'}
|
22
|
+
|
23
|
+
parsed_body = JSON.parse(response.body)
|
24
|
+
parsed_body["success"].should eq(true)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should return model, columns, and fields" do
|
28
|
+
|
29
|
+
post :base, {:use_route => :rails_db_admin,
|
30
|
+
:action => "setup_table_grid",
|
31
|
+
:table => 'role_types'}
|
32
|
+
|
33
|
+
parsed_body = JSON.parse(response.body)
|
34
|
+
parsed_body["model"].should eq("role_types")
|
35
|
+
parsed_body["columns"].should include(
|
36
|
+
{"header"=>"id", "type"=>"number", "dataIndex"=>"id", "width"=>150})
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should return true even if there is not an 'id' column on the table in question" do
|
40
|
+
|
41
|
+
post :base, {:use_route => :rails_db_admin,
|
42
|
+
:action => "setup_table_grid",
|
43
|
+
:table => 'preference_options_preference_types'}
|
44
|
+
|
45
|
+
parsed_body = JSON.parse(response.body)
|
46
|
+
parsed_body["success"].should eq(true)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should return model, columns, and fields even if there is not an 'id' column on a table
|
50
|
+
and should have a 'fake_id' column in the fields and columns array" do
|
51
|
+
|
52
|
+
post :base, {:use_route => :rails_db_admin,
|
53
|
+
:action => "setup_table_grid",
|
54
|
+
:table => 'preference_options_preference_types'}
|
55
|
+
|
56
|
+
parsed_body = JSON.parse(response.body)
|
57
|
+
|
58
|
+
parsed_body["model"].should eq("preference_options_preference_types")
|
59
|
+
parsed_body["columns"][0].should include(
|
60
|
+
{"header"=>"preference_type_id",
|
61
|
+
"type"=>"number",
|
62
|
+
"dataIndex"=>"preference_type_id",
|
63
|
+
"width"=>150,
|
64
|
+
"editor"=>{"xtype"=>"textfield"}})
|
65
|
+
parsed_body["columns"][4].should include(
|
66
|
+
{"header"=>"fake_id", "type"=>"number", "dataIndex"=>"fake_id", "hidden"=>true}
|
67
|
+
)
|
68
|
+
parsed_body["fields"].should include(
|
69
|
+
{"name" => "preference_type_id"})
|
70
|
+
parsed_body["fields"].should include(
|
71
|
+
{"name" => "fake_id"})
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should return a value called id_property that equals 'fake_id'" do
|
75
|
+
|
76
|
+
post :base, {:use_route => :rails_db_admin,
|
77
|
+
:action => "setup_table_grid",
|
78
|
+
:table => 'preference_options_preference_types'}
|
79
|
+
|
80
|
+
parsed_body = JSON.parse(response.body)
|
81
|
+
parsed_body["id_property"].should eq("fake_id")
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should return a value called id_property that equals 'id'" do
|
85
|
+
|
86
|
+
post :base, {:use_route => :rails_db_admin,
|
87
|
+
:action => "setup_table_grid",
|
88
|
+
:table => 'role_types'}
|
89
|
+
|
90
|
+
parsed_body = JSON.parse(response.body)
|
91
|
+
parsed_body["id_property"].should eq("id")
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "GET table_data" do
|
96
|
+
|
97
|
+
it "should return JSON to display in an ExtJS data grid for Rails tables with an Id column" do
|
98
|
+
|
99
|
+
get :base, {:use_route => :rails_db_admin,
|
100
|
+
:action => "table_data",
|
101
|
+
:table => "role_types"}
|
102
|
+
|
103
|
+
parsed_body = JSON.parse(response.body)
|
104
|
+
parsed_body["totalCount"].should eq(2)
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should return 1 row because start is increased by 1, but totalCount should remain 2" do
|
108
|
+
|
109
|
+
get :base, {:use_route => :rails_db_admin,
|
110
|
+
:action => "table_data",
|
111
|
+
:table => "role_types",
|
112
|
+
:start => "1"}
|
113
|
+
|
114
|
+
parsed_body = JSON.parse(response.body)
|
115
|
+
parsed_body["totalCount"].should eq(2)
|
116
|
+
parsed_body["data"].length.should eq(1)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should return 1 row because limit is set to 1, but totalCount should remain 2" do
|
120
|
+
|
121
|
+
get :base, {:use_route => :rails_db_admin,
|
122
|
+
:action => "table_data",
|
123
|
+
:table => "role_types",
|
124
|
+
:limit => "1"}
|
125
|
+
|
126
|
+
parsed_body = JSON.parse(response.body)
|
127
|
+
parsed_body["totalCount"].should eq(2)
|
128
|
+
parsed_body["data"].length.should eq(1)
|
129
|
+
end
|
130
|
+
|
131
|
+
#TODO: Need to setup Factory Girl to dummy up data for this test
|
132
|
+
it "should return successfully with a fake_id column because there is no id column defined in the DB" do
|
133
|
+
|
134
|
+
get :base, {:use_route => :rails_db_admin,
|
135
|
+
:action => "table_data",
|
136
|
+
:table => 'preference_options_preference_types'}
|
137
|
+
|
138
|
+
parsed_body = JSON.parse(response.body)
|
139
|
+
parsed_body["totalCount"].should eq(0)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
|
144
|
+
describe "PUT table_data" do
|
145
|
+
|
146
|
+
before(:each) do
|
147
|
+
@pref_opt_types_data = {"preference_type_id" => "1",
|
148
|
+
"preference_option_id" => "2",
|
149
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
150
|
+
"updated_at" => "2011-10-11 00:54:56.137144"}
|
151
|
+
@role_types_data = {"id" => 2,
|
152
|
+
"parent_id" => "",
|
153
|
+
"lft" => "3",
|
154
|
+
"rgt" => "4",
|
155
|
+
"description" => "Partner-Test",
|
156
|
+
"comments" => "",
|
157
|
+
"internal_identifier" => "partner",
|
158
|
+
"external_identifier" => "",
|
159
|
+
"external_id_source" => "",
|
160
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
161
|
+
"updated_at" => "2011-10-11 00:54:56.137144"}
|
162
|
+
@mod_role_types_data = {"parent_id" => "",
|
163
|
+
"lft" => "3",
|
164
|
+
"rgt" => "4",
|
165
|
+
"description" => "Partner-Test",
|
166
|
+
"comments" => "",
|
167
|
+
"internal_identifier" => "partner",
|
168
|
+
"external_identifier" => "",
|
169
|
+
"external_id_source" => "",
|
170
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
171
|
+
"updated_at" => "2011-10-11 00:54:56.137144"}
|
172
|
+
@table_support = double("RailsDbAdmin::TableSupport")
|
173
|
+
@json_data_builder = double("RailsDbAdmin::Extjs::JsonDataBuilder")
|
174
|
+
|
175
|
+
RailsDbAdmin::TableSupport.should_receive(
|
176
|
+
:new).and_return(@table_support)
|
177
|
+
RailsDbAdmin::Extjs::JsonDataBuilder.should_receive(
|
178
|
+
:new).and_return(@json_data_builder)
|
179
|
+
end
|
180
|
+
|
181
|
+
it "should return success" do
|
182
|
+
|
183
|
+
@table = "role_types"
|
184
|
+
@pkey = ['id', "2"]
|
185
|
+
|
186
|
+
@table_support.should_receive(:primary_key?).with(@table).and_return(true)
|
187
|
+
@table_support.should_receive(:primary_key).with(@table).and_return(['id', nil])
|
188
|
+
|
189
|
+
@table_support.should_receive(:update_table).with(
|
190
|
+
@table, @pkey, @mod_role_types_data)
|
191
|
+
@json_data_builder.should_receive(:get_row_data).with(
|
192
|
+
@table, @pkey).and_return(@role_types_data)
|
193
|
+
|
194
|
+
put :base, {:use_route => :rails_db_admin,
|
195
|
+
:action => "table_data",
|
196
|
+
:table => @table,
|
197
|
+
:data => [@role_types_data, @role_types_data] }
|
198
|
+
|
199
|
+
parsed_body = JSON.parse(response.body)
|
200
|
+
parsed_body["success"].should eq(true)
|
201
|
+
end
|
202
|
+
|
203
|
+
it "should update table data and return success even if there is not an 'id' column" do
|
204
|
+
|
205
|
+
@pref_opt_types_data = {"preference_type_id" => "1",
|
206
|
+
"preference_option_id" => "2",
|
207
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
208
|
+
"updated_at" => "",
|
209
|
+
"fake_id" => "162"}
|
210
|
+
|
211
|
+
@table = "preference_options_preference_types"
|
212
|
+
|
213
|
+
@table_support.should_receive(:primary_key?).with(@table).and_return(false)
|
214
|
+
|
215
|
+
@table_support.should_receive(:update_table_without_id).with(
|
216
|
+
@table, [@pref_opt_types_data, @pref_opt_types_data])
|
217
|
+
|
218
|
+
@json_data_builder.should_receive(:get_row_data_no_id).with(
|
219
|
+
@table, @pref_opt_types_data).and_return(
|
220
|
+
@pref_opt_types_data)
|
221
|
+
|
222
|
+
put :base, {:use_route => :rails_db_admin,
|
223
|
+
:action => "table_data",
|
224
|
+
:table => @table,
|
225
|
+
:data => [@pref_opt_types_data, @pref_opt_types_data]}
|
226
|
+
|
227
|
+
parsed_body = JSON.parse(response.body)
|
228
|
+
parsed_body["success"].should eq(true)
|
229
|
+
parsed_body["data"].should eq(@pref_opt_types_data)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
describe "POST table_data" do
|
234
|
+
|
235
|
+
before(:each) do
|
236
|
+
@table_support = double("RailsDbAdmin::TableSupport")
|
237
|
+
@json_data_builder = double("RailsDbAdmin::Extjs::JsonDataBuilder")
|
238
|
+
|
239
|
+
RailsDbAdmin::TableSupport.should_receive(
|
240
|
+
:new).and_return(@table_support)
|
241
|
+
RailsDbAdmin::Extjs::JsonDataBuilder.should_receive(
|
242
|
+
:new).and_return(@json_data_builder)
|
243
|
+
end
|
244
|
+
|
245
|
+
it "should return success and the row that was created" do
|
246
|
+
|
247
|
+
@table = "role_types"
|
248
|
+
|
249
|
+
@role_types_data = {"id" => 3,
|
250
|
+
"parent_id" => "",
|
251
|
+
"lft" => "3",
|
252
|
+
"rgt" => "4",
|
253
|
+
"description" => "Partner-Test",
|
254
|
+
"comments" => "",
|
255
|
+
"internal_identifier" => "partner",
|
256
|
+
"external_identifier" => "",
|
257
|
+
"external_id_source" => "",
|
258
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
259
|
+
"updated_at" => "2011-10-11 00:54:56.137144"}
|
260
|
+
|
261
|
+
@mod_types_data = {"parent_id" => "",
|
262
|
+
"lft" => "3",
|
263
|
+
"rgt" => "4",
|
264
|
+
"description" => "Partner-Test",
|
265
|
+
"comments" => "",
|
266
|
+
"internal_identifier" => "partner",
|
267
|
+
"external_identifier" => "",
|
268
|
+
"external_id_source" => "",
|
269
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
270
|
+
"updated_at" => "2011-10-11 00:54:56.137144"}
|
271
|
+
|
272
|
+
@table_support.should_receive(:primary_key?).with(@table).and_return(true)
|
273
|
+
@table_support.should_receive(:primary_key).with(@table).and_return(['id', nil])
|
274
|
+
@table_support.should_receive(:insert_row).with(@table, @mod_types_data).
|
275
|
+
and_return(3)
|
276
|
+
@json_data_builder.should_receive(:get_row_data).with(@table,["id",3]).
|
277
|
+
and_return(@role_types_data)
|
278
|
+
|
279
|
+
post :base, {:use_route => :rails_db_admin,
|
280
|
+
:action => "table_data",
|
281
|
+
:table => @table,
|
282
|
+
:data => @role_types_data}
|
283
|
+
|
284
|
+
parsed_body = JSON.parse(response.body)
|
285
|
+
parsed_body["success"].should eq(true)
|
286
|
+
parsed_body[:data].should eq(@roles_types_data)
|
287
|
+
end
|
288
|
+
|
289
|
+
it "should return success even with empty row hashed passed in" do
|
290
|
+
|
291
|
+
@table = "role_types"
|
292
|
+
@role_types_data = {"id" => "",
|
293
|
+
"parent_id" => "",
|
294
|
+
"lft" => "",
|
295
|
+
"rgt" => "",
|
296
|
+
"description" => "",
|
297
|
+
"comments" => "",
|
298
|
+
"internal_identifier" => "",
|
299
|
+
"external_identifier" => "",
|
300
|
+
"external_id_source" => "",
|
301
|
+
"created_at" => "",
|
302
|
+
"updated_at" => ""}
|
303
|
+
|
304
|
+
@mod_types_data = {"parent_id" => "",
|
305
|
+
"lft" => "",
|
306
|
+
"rgt" => "",
|
307
|
+
"description" => "",
|
308
|
+
"comments" => "",
|
309
|
+
"internal_identifier" => "",
|
310
|
+
"external_identifier" => "",
|
311
|
+
"external_id_source" => "",
|
312
|
+
"created_at" => "",
|
313
|
+
"updated_at" => ""}
|
314
|
+
|
315
|
+
@table_support.should_receive(:primary_key?).with(@table).and_return(true)
|
316
|
+
@table_support.should_receive(:primary_key).with(@table).and_return(['id', nil])
|
317
|
+
|
318
|
+
@table_support.should_receive(:insert_row).with(@table, @mod_types_data).
|
319
|
+
and_return(3)
|
320
|
+
@json_data_builder.should_receive(:get_row_data).with(@table,["id",3]).
|
321
|
+
and_return(@role_types_data)
|
322
|
+
|
323
|
+
post :base, {:use_route => :rails_db_admin,
|
324
|
+
:action => "table_data",
|
325
|
+
:table => @table,
|
326
|
+
:data => @role_types_data}
|
327
|
+
|
328
|
+
parsed_body = JSON.parse(response.body)
|
329
|
+
parsed_body["success"].should eq(true)
|
330
|
+
parsed_body[:data].should eq(@roles_types_data)
|
331
|
+
end
|
332
|
+
|
333
|
+
it "should return success and the inserted data, with a row with a 'fake_id'" do
|
334
|
+
|
335
|
+
@table = "preference_options_preference_types"
|
336
|
+
@pref_opt_types_data = {"preference_type_id" => "1",
|
337
|
+
"preference_option_id" => "2",
|
338
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
339
|
+
"updated_at" => "2011-10-11 00:54:56.137144",
|
340
|
+
"fake_id" => "5"}
|
341
|
+
|
342
|
+
@mod_data = {"preference_type_id" => "1",
|
343
|
+
"preference_option_id" => "2",
|
344
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
345
|
+
"updated_at" => "2011-10-11 00:54:56.137144"}
|
346
|
+
|
347
|
+
@final_data = {"preference_type_id" => "1",
|
348
|
+
"preference_option_id" => "2",
|
349
|
+
"created_at" => "2011-10-11 00:54:56.137144",
|
350
|
+
"updated_at" => "2011-10-11 00:54:56.137144",
|
351
|
+
"fake_id" => 300}
|
352
|
+
|
353
|
+
@table_support.should_receive(:primary_key?).with(@table).and_return(false)
|
354
|
+
@table_support.should_receive(:insert_row).with(@table, @mod_data, true).and_return(300)
|
355
|
+
|
356
|
+
@json_data_builder.should_receive(:get_row_data_no_id).with(
|
357
|
+
@table, @mod_data).and_return(
|
358
|
+
@pref_opt_types_data)
|
359
|
+
|
360
|
+
post :base, {:use_route => :rails_db_admin,
|
361
|
+
:action => "table_data",
|
362
|
+
:table => @table,
|
363
|
+
:data => @pref_opt_types_data}
|
364
|
+
|
365
|
+
parsed_body = JSON.parse(response.body)
|
366
|
+
parsed_body["success"].should eq(true)
|
367
|
+
parsed_body["data"].should eq(@final_data)
|
368
|
+
end
|
369
|
+
|
370
|
+
it "should return success and the inserted data, with a row with a 'fake_id', with empty data passed in" do
|
371
|
+
|
372
|
+
@table = "preference_options_preference_types"
|
373
|
+
@pref_opt_types_data = {"preference_type_id" => "",
|
374
|
+
"preference_option_id" => "",
|
375
|
+
"created_at" => "",
|
376
|
+
"updated_at" => "",
|
377
|
+
"fake_id" => ""}
|
378
|
+
|
379
|
+
@mod_data = {"preference_type_id" => "",
|
380
|
+
"preference_option_id" => "",
|
381
|
+
"created_at" => "",
|
382
|
+
"updated_at" => ""}
|
383
|
+
|
384
|
+
@final_data = {"preference_type_id" => "",
|
385
|
+
"preference_option_id" => "",
|
386
|
+
"created_at" => "",
|
387
|
+
"updated_at" => "",
|
388
|
+
"fake_id" => 300}
|
389
|
+
|
390
|
+
@table_support.should_receive(:primary_key?).with(@table).and_return(false)
|
391
|
+
@table_support.should_receive(:insert_row).with(@table, @mod_data, true).and_return(300)
|
392
|
+
|
393
|
+
@json_data_builder.should_receive(:get_row_data_no_id).with(
|
394
|
+
@table, @mod_data).and_return(
|
395
|
+
@pref_opt_types_data)
|
396
|
+
|
397
|
+
post :base, {:use_route => :rails_db_admin,
|
398
|
+
:action => "table_data",
|
399
|
+
:table => @table,
|
400
|
+
:data => @pref_opt_types_data}
|
401
|
+
|
402
|
+
parsed_body = JSON.parse(response.body)
|
403
|
+
parsed_body["success"].should eq(true)
|
404
|
+
parsed_body["data"].should eq(@final_data)
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
|
409
|
+
describe "DELETE table_data" do
|
410
|
+
|
411
|
+
before(:each) do
|
412
|
+
@table_support = double("RailsDbAdmin::TableSupport")
|
413
|
+
RailsDbAdmin::TableSupport.should_receive(
|
414
|
+
:new).and_return(@table_support)
|
415
|
+
end
|
416
|
+
|
417
|
+
it "should process the request successfully" do
|
418
|
+
|
419
|
+
@table = "role_types"
|
420
|
+
@table_support.should_receive(:primary_key?).with(@table).and_return(true)
|
421
|
+
@table_support.should_receive(:primary_key).with(@table).and_return(['id', nil])
|
422
|
+
id = ["id", "2"]
|
423
|
+
|
424
|
+
@table_support.should_receive(:delete_row).with(
|
425
|
+
@table, id)
|
426
|
+
|
427
|
+
delete :base, {:use_route => :rails_db_admin,
|
428
|
+
:action => "table_data",
|
429
|
+
:table => @table,
|
430
|
+
:id => "2"}
|
431
|
+
end
|
432
|
+
|
433
|
+
it "should fail because we don't send an id parameter" do
|
434
|
+
|
435
|
+
id = "2"
|
436
|
+
@table_support.should_receive(:primary_key?).and_return(false)
|
437
|
+
|
438
|
+
delete :base, {:use_route => :rails_db_admin,
|
439
|
+
:action => "table_data",
|
440
|
+
:table => "role_types",
|
441
|
+
:id => id}
|
442
|
+
|
443
|
+
parsed_body = JSON.parse(response.body)
|
444
|
+
parsed_body["success"].should eq(false)
|
445
|
+
parsed_body["exception"].should eq("Unable to determine primary key "\
|
446
|
+
"on this table. Delete not performed")
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
450
|
+
describe "GET tables" do
|
451
|
+
|
452
|
+
it "should return data for a tree grid of tables" do
|
453
|
+
|
454
|
+
get :base, {:use_route => :rails_db_admin,
|
455
|
+
:action => "tables",
|
456
|
+
:node => "root"}
|
457
|
+
|
458
|
+
parsed_body = JSON.parse(response.body)
|
459
|
+
parsed_body[0].should eq({"isTable"=>true, "text"=>"app_containers",
|
460
|
+
"id"=>"app_containers", "iconCls"=>"icon-data",
|
461
|
+
"leaf"=>false})
|
462
|
+
end
|
463
|
+
|
464
|
+
it "should create nested tree of column names if a node id is passed in" do
|
465
|
+
|
466
|
+
get :base, {:use_route => :rails_db_admin,
|
467
|
+
:action => "tables",
|
468
|
+
:node => "app_containers"}
|
469
|
+
|
470
|
+
parsed_body = JSON.parse(response.body)
|
471
|
+
parsed_body[0].should eq({"text"=>"id : integer",
|
472
|
+
"iconCls"=>"icon-gear",
|
473
|
+
"leaf"=>true})
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
after(:all) do
|
478
|
+
RoleType.where(:internal_identifier => "execute_query_test_role").destroy_all
|
479
|
+
RoleType.where(:internal_identifier => "execute_query_test_role_2").destroy_all
|
480
|
+
end
|
481
|
+
end
|