visual_query 0.3.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 (149) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +59 -0
  4. data/Rakefile +23 -0
  5. data/app/assets/images/visual_query/ajax-loader.gif +0 -0
  6. data/app/assets/javascripts/visual_query/index.js +288 -0
  7. data/app/assets/stylesheets/visual_query/visual_query.css +161 -0
  8. data/app/controllers/queries_controller.rb +157 -0
  9. data/app/helpers/application_helper.rb +5 -0
  10. data/app/helpers/queries_helper.rb +43 -0
  11. data/app/views/queries/_columns.html.erb +5 -0
  12. data/app/views/queries/_command.html.erb +5 -0
  13. data/app/views/queries/_command_results_browser.html.erb +1 -0
  14. data/app/views/queries/_command_save.html.erb +1 -0
  15. data/app/views/queries/_commands_results.html.erb +2 -0
  16. data/app/views/queries/_filter.html.erb +6 -0
  17. data/app/views/queries/_list_all_relations.html.erb +8 -0
  18. data/app/views/queries/_list_joinable_relations.html.erb +10 -0
  19. data/app/views/queries/_list_relation.html.erb +8 -0
  20. data/app/views/queries/_name.html.erb +8 -0
  21. data/app/views/queries/_results.html.erb +14 -0
  22. data/app/views/queries/_results_column_filter.html.erb +3 -0
  23. data/app/views/queries/_results_column_hide.html.erb +3 -0
  24. data/app/views/queries/_results_column_human_name.html.erb +8 -0
  25. data/app/views/queries/_results_empty.html.erb +3 -0
  26. data/app/views/queries/_sort.html.erb +12 -0
  27. data/app/views/queries/_sort_condition.html.erb +18 -0
  28. data/app/views/queries/_url_root.html.erb +1 -0
  29. data/app/views/queries/_warning_large_result_set.html.erb +12 -0
  30. data/app/views/queries/filters/_boolean.html.erb +6 -0
  31. data/app/views/queries/filters/_date.html.erb +17 -0
  32. data/app/views/queries/filters/_datetime.html.erb +1 -0
  33. data/app/views/queries/filters/_decimal.html.erb +1 -0
  34. data/app/views/queries/filters/_integer.html.erb +1 -0
  35. data/app/views/queries/filters/_numeric.html.erb +6 -0
  36. data/app/views/queries/filters/_string.html.erb +1 -0
  37. data/app/views/queries/filters/_text.html.erb +6 -0
  38. data/app/views/queries/index.html.erb +39 -0
  39. data/app/views/queries/new.html.erb +27 -0
  40. data/app/views/queries/not_found.html.erb +1 -0
  41. data/app/views/queries/show.html.erb +40 -0
  42. data/app/views/queries/sql_form.html.erb +16 -0
  43. data/config/initializers/visual_query.rb +11 -0
  44. data/config/routes.rb +26 -0
  45. data/db/migrate/20130927090319_create_visual_query_schema.rb +9 -0
  46. data/db/migrate/20130927090400_create_visual_query_metadata_table.rb +16 -0
  47. data/lib/tasks/visual_query_tasks.rake +12 -0
  48. data/lib/tutuf/visual_query.rb +6 -0
  49. data/lib/tutuf/visual_query/base.rb +268 -0
  50. data/lib/tutuf/visual_query/common.rb +58 -0
  51. data/lib/tutuf/visual_query/metadata.rb +35 -0
  52. data/lib/tutuf/visual_query/single.rb +111 -0
  53. data/lib/tutuf/visual_query/sql.rb +20 -0
  54. data/lib/visual_query.rb +4 -0
  55. data/lib/visual_query/engine.rb +4 -0
  56. data/lib/visual_query/version.rb +3 -0
  57. data/test/dummy/README.rdoc +261 -0
  58. data/test/dummy/Rakefile +7 -0
  59. data/test/dummy/app/assets/javascripts/application.js +15 -0
  60. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  61. data/test/dummy/app/controllers/application_controller.rb +3 -0
  62. data/test/dummy/app/helpers/application_helper.rb +2 -0
  63. data/test/dummy/app/models/account.rb +3 -0
  64. data/test/dummy/app/models/address.rb +3 -0
  65. data/test/dummy/app/models/category.rb +3 -0
  66. data/test/dummy/app/models/composite_pk.rb +3 -0
  67. data/test/dummy/app/models/customer.rb +4 -0
  68. data/test/dummy/app/models/order.rb +4 -0
  69. data/test/dummy/app/models/person.rb +4 -0
  70. data/test/dummy/app/models/post.rb +3 -0
  71. data/test/dummy/app/models/product.rb +4 -0
  72. data/test/dummy/app/models/product_in.rb +3 -0
  73. data/test/dummy/app/models/product_out.rb +3 -0
  74. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  75. data/test/dummy/config.ru +4 -0
  76. data/test/dummy/config/application.rb +53 -0
  77. data/test/dummy/config/boot.rb +10 -0
  78. data/test/dummy/config/database.yml +12 -0
  79. data/test/dummy/config/environment.rb +5 -0
  80. data/test/dummy/config/environments/development.rb +29 -0
  81. data/test/dummy/config/environments/production.rb +65 -0
  82. data/test/dummy/config/environments/test.rb +33 -0
  83. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  84. data/test/dummy/config/initializers/inflections.rb +15 -0
  85. data/test/dummy/config/initializers/mime_types.rb +5 -0
  86. data/test/dummy/config/initializers/secret_token.rb +7 -0
  87. data/test/dummy/config/initializers/session_store.rb +8 -0
  88. data/test/dummy/config/initializers/visual_query.rb +1 -0
  89. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  90. data/test/dummy/config/locales/en.yml +5 -0
  91. data/test/dummy/config/routes.rb +3 -0
  92. data/test/dummy/db/migrate/20130927112446_create_tables.rb +77 -0
  93. data/test/dummy/db/structure.sql +651 -0
  94. data/test/dummy/log/development.log +1548 -0
  95. data/test/dummy/log/test.log +36575 -0
  96. data/test/dummy/public/404.html +26 -0
  97. data/test/dummy/public/422.html +26 -0
  98. data/test/dummy/public/500.html +25 -0
  99. data/test/dummy/public/favicon.ico +0 -0
  100. data/test/dummy/script/rails +6 -0
  101. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/-h/-hj2e_RSTanfbfrP0tso5Q7actRM6_clE5hetFlQ2y8.cache +1 -0
  102. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/3B/3B_zqoNDfkO8wvAME66zxm9KzQaeDVSjnH0qC08yufM.cache +1 -0
  103. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/5g/5g7dhxVp4YbZmFw_-T3aU2oYq2Z9Jgtps0CKneXYSS0.cache +2 -0
  104. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/6-/6-CtZO6uG0yfwU8-098Sdy2wnfO0W6DbFu6B6DKYuiw.cache +1 -0
  105. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/8k/8kFIVN4cTS9KCQt_UIF5s_rcY-bMYlQpM489D98hvP4.cache +1 -0
  106. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Au/AukU7t3xLnyCh7qW4u45q9YFmjVcYujmIFbnaOhF4Mo.cache +1 -0
  107. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Bm/Bmsq0vYQqlrtfq5s-W8kcfLvwcsPT_6_5XxXt9J_QOw.cache +1 -0
  108. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/CQ/CQLNg7a2TsUWgc7JXjDkjseMig_dPVm6AvqO2IWk5zg.cache +0 -0
  109. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/FX/FX9ZXN3HEHR5hPzvxW8rakWEt2ot4IPJyDB67O7KPZk.cache +2 -0
  110. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Hv/HvOStITEkFHlcJCgaDnND6wzPw4dMmdAdZB1Xm6JfSA.cache +0 -0
  111. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/NW/NWCtuFzfIgixavqY71NIAa4ajbsXxRuiLNjceHgQ24M.cache +2 -0
  112. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Ta/TaG641Ow168nkagg10mh6zuWS8RwWuawpHuMGakCVjU.cache +0 -0
  113. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/VN/VNCapNKJLeponthNeFJhaBYs92UBT3P8PugENHP0474.cache +2 -0
  114. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/VR/VRi0Hz7tc62H5Of9XVjyAk7vSNmMr8xeYowo6lSBnZg.cache +2 -0
  115. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Vg/Vgl_u6t3BvczgGi_ZJlyyo7xYSe-GgEshLofx-3QorI.cache +1 -0
  116. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Vq/VqGJMF3Cpvp3fw2IEIkE2tzdFo_OdcEmxN58BQwbVDY.cache +0 -0
  117. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/W6/W6DnXCIMHJ2i5hUkEiNeDLroWxW3VU18nq292n5jlts.cache +0 -0
  118. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Z7/Z7fH8ST-O3GMnDUKvtKHHTSObfH2Nbs0J1QS79i80yE.cache +0 -0
  119. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Zh/ZhrmuPgfbHthzikN8QSHR0Q0bLtSYS1Bzl9HauWeDfU.cache +0 -0
  120. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/bY/bYzYCY_bAGQGVGMbcxtKIhUYrgDQhmQVTmK50JrMNb8.cache +0 -0
  121. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/eT/eTmCDSnc2m9ER5Cn85g84xyTkVLWKLbbwPFQo8eUAIg.cache +0 -0
  122. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/h-/h-taE7cHlbq76GUb5kHenjih_y66mO0w0lIZs7vY-0s.cache +1 -0
  123. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/ji/jikmiWyu-cXN_ZJ4hgLc3kuCAY-QJY2jmPeXS4_9vZY.cache +0 -0
  124. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/kC/kCijps52gsNlkYgT2Qzdz9UcSaxhcMGNfNL7MIiWk54.cache +1 -0
  125. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/kQ/kQt-OsUDJg_sl1be-FqJ6Vhw4XVguw9_msZEwXP0Nh0.cache +0 -0
  126. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/nd/ndbe-ZZWBqU5gLx5nxauCFvv963Zm3xqVEwVYQ7X_X8.cache +1 -0
  127. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/q6/q6BYa32YJF11eGVapO4ouNl6gayPIsARgMavlzZmoi0.cache +0 -0
  128. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/sm/sm7AdmddDYbFx4-eo_y_kaZspanmc-jiJeM8j2DXX5k.cache +1 -0
  129. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/ux/uxPH9lLOW42lEQxJXnBizEObZReD8qkz6Eb6fdS6Ur4.cache +1 -0
  130. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/wn/wn0ayyM-chRdwEPI11SLkFT-7G2-GcOX8UIIC2kOWLY.cache +1 -0
  131. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/x7/x7KkTV3ibfIEysLB_ug5bfmnn2VLV_BldukPR3EoPBk.cache +0 -0
  132. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/xK/xKo0PfDcZuMh8oO-6Gr4j4S8eR2qUNY9Gau4kAxKIH0.cache +1 -0
  133. data/test/fixtures/accounts.yml +4 -0
  134. data/test/fixtures/categories.yml +3 -0
  135. data/test/fixtures/categories_posts.yml +3 -0
  136. data/test/fixtures/people.yml +8 -0
  137. data/test/fixtures/posts.yml +8 -0
  138. data/test/fixtures/product_ins.yml +15 -0
  139. data/test/fixtures/product_outs.yml +5 -0
  140. data/test/fixtures/products.yml +6 -0
  141. data/test/fixtures/saved_queries.rb +7 -0
  142. data/test/functional/queries_controller_test.rb +267 -0
  143. data/test/functional/routes_test.rb +111 -0
  144. data/test/integration/navigation_test.rb +10 -0
  145. data/test/test_helper.rb +15 -0
  146. data/test/unit/metadata_test.rb +10 -0
  147. data/test/unit/sql_test.rb +37 -0
  148. data/test/unit/visual_query_test.rb +648 -0
  149. metadata +381 -0
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/404.html -->
21
+ <div class="dialog">
22
+ <h1>The page you were looking for doesn't exist.</h1>
23
+ <p>You may have mistyped the address or the page may have moved.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/422.html -->
21
+ <div class="dialog">
22
+ <h1>The change you wanted was rejected.</h1>
23
+ <p>Maybe you tried to change something you didn't have access to.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/500.html -->
21
+ <div class="dialog">
22
+ <h1>We're sorry, but something went wrong.</h1>
23
+ </div>
24
+ </body>
25
+ </html>
File without changes
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1 @@
1
+ "%��)��~&�mP�C?��EF@ �'���|k��
@@ -0,0 +1 @@
1
+ I"}app/assets/stylesheets/application.css?type=text/css&id=f148d8afadb92da0af9005e87642010f1aae01cf5774638c8b321a5d199093ff:ET
@@ -0,0 +1,2 @@
1
+ [o:Set:
2
+ @hash{I"environment-version:ETTI"environment-paths;TTI"Lprocessors:type=application/javascript&file_type=application/javascript;TTI"8file-digest://app/assets/javascripts/application.js;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTI"jfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery.js;TTI"nfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery_ujs.js;TTI")file-digest://app/assets/javascripts;TTI"0file-digest://app/assets/javascripts/jquery;TTI")file-digest://app/assets/stylesheets;TTI"0file-digest://app/assets/stylesheets/jquery;TTI"[file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/images;TTI"bfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/images/jquery;TTI"`file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/javascripts;TTI"gfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/javascripts/jquery;TTI"`file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/stylesheets;TTI"gfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/stylesheets/jquery;TTI"`file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts;TTI"gfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery;TTI"4file-digest://app/assets/javascripts/jquery_ujs;TTI"4file-digest://app/assets/stylesheets/jquery_ujs;TTI"ffile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/images/jquery_ujs;TTI"kfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/javascripts/jquery_ujs;TTI"kfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/stylesheets/jquery_ujs;TTI"kfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery_ujs;TT
@@ -0,0 +1 @@
1
+ I"�app/assets/stylesheets/application.css?type=text/css&pipeline=self&id=cca9e3d5c9de2173e8388506a4fa0180e0810cca096d5531d0897b4eb23e428b:ET
@@ -0,0 +1 @@
1
+ "%>��.��l�;T��_2��IT���Ɣc�ḩ
@@ -0,0 +1 @@
1
+ "%����-�!JaN��F�����D7�Zx2�����
@@ -0,0 +1 @@
1
+ "%|�<�i�Xc�0�ګ��r�.Cn���WJ�
@@ -0,0 +1,2 @@
1
+ [o:Set:
2
+ @hash{ I"environment-version:ETTI"environment-paths;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTI"nfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery_ujs.js;TT
@@ -0,0 +1,2 @@
1
+ "%~�n��Um�lr�+� Mp��
2
+ ���4v����
@@ -0,0 +1,2 @@
1
+ [o:Set:
2
+ @hash{I"environment-version:ETTI"environment-paths;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTI"8file-digest://app/assets/javascripts/application.js;TTI")file-digest://app/assets/javascripts;TTI"0file-digest://app/assets/javascripts/jquery;TTI")file-digest://app/assets/stylesheets;TTI"0file-digest://app/assets/stylesheets/jquery;TTI"[file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/images;TTI"bfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/images/jquery;TTI"`file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/javascripts;TTI"gfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/javascripts/jquery;TTI"`file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/stylesheets;TTI"gfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/stylesheets/jquery;TTI"`file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts;TTI"gfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery;TTI"jfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery.js;TTI"4file-digest://app/assets/javascripts/jquery_ujs;TTI"4file-digest://app/assets/stylesheets/jquery_ujs;TTI"ffile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/images/jquery_ujs;TTI"kfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/javascripts/jquery_ujs;TTI"kfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/stylesheets/jquery_ujs;TTI"kfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery_ujs;TTI"nfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery_ujs.js;TT
@@ -0,0 +1,2 @@
1
+ [o:Set:
2
+ @hash{ I"environment-version:ETTI"environment-paths;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTI"jfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery.js;TT
@@ -0,0 +1 @@
1
+ I"}app/assets/stylesheets/application.css?type=text/css&id=82ab063fe50c0b6714393730e7315c2b0c929b84fe0496dc8a7cc5d6a0d47c8e:ET
@@ -0,0 +1 @@
1
+ "%��}�������J�d���p�A,#G�� �j��
@@ -0,0 +1 @@
1
+ I"�app/assets/javascripts/application.js?type=application/javascript&id=e6228cacc04b0de6587d4ce0cdbe9bd721af5a46edfd9d45a4ffdc0437e2e65a:ET
@@ -0,0 +1 @@
1
+ I"�/Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery_ujs.js?type=application/javascript&pipeline=self&id=3915e85e8d1d17531a18c82fab63477f8cd2e481c3fa2a400eb259ea826aa43c:ET
@@ -0,0 +1 @@
1
+ I"�app/assets/stylesheets/application.css?type=text/css&pipeline=self&id=7df53d3bd13a8e722b91346d8202c7dea6c80d890c4bb7cbdea5e676d8a55c7a:ET
@@ -0,0 +1 @@
1
+ I"�/Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery.js?type=application/javascript&pipeline=self&id=dbb44a3b0785197032e8bc9422d997334df7ae48354459660586bfecfeaf2147:ET
@@ -0,0 +1 @@
1
+ I"�app/assets/javascripts/application.js?type=application/javascript&pipeline=self&id=f7d72495b8bb6480c8f19d818ccd0df33855f7c90fa185b80371187a677f1585:ET
@@ -0,0 +1 @@
1
+ "%��Rm�v�S3.��O�L���ڹc�ƕq�=_j�
@@ -0,0 +1,4 @@
1
+ john:
2
+ id: 1
3
+ name: jat
4
+ person_id: 1
@@ -0,0 +1,3 @@
1
+ first:
2
+ id: 1
3
+ name: first
@@ -0,0 +1,3 @@
1
+ first:
2
+ category_id: 1
3
+ post_id: 1
@@ -0,0 +1,8 @@
1
+ john:
2
+ id: 1
3
+ name: John Atanasoff
4
+ age: 34
5
+ cyrillic:
6
+ id: 2
7
+ name: Джон Атанасов
8
+ age: 34
@@ -0,0 +1,8 @@
1
+ first:
2
+ id: 1
3
+ title: "First post!"
4
+ body: "Wankers like first post"
5
+ with_non_windows_1251_chars:
6
+ id: 2
7
+ title: "Màmìta Español"
8
+ body: ""
@@ -0,0 +1,15 @@
1
+ red_pencil:
2
+ id: 1
3
+ product_id: 1
4
+ quantity: 23
5
+ buy_price: 7
6
+ blue_pencil:
7
+ id: 2
8
+ product_id: 1
9
+ quantity: 14
10
+ buy_price: 10
11
+ bottle_700_ml:
12
+ id: 3
13
+ product_id: 2
14
+ quantity: 67
15
+ buy_price: 25
@@ -0,0 +1,5 @@
1
+ red_pencil:
2
+ id: 1
3
+ product_id: 1
4
+ quantity: 45
5
+ sale_price: 10
@@ -0,0 +1,6 @@
1
+ pencil:
2
+ id: 1
3
+ name: pencil
4
+ bottle:
5
+ id: 2
6
+ name: bottle
@@ -0,0 +1,7 @@
1
+ raise "Can't save first fixture query" unless Tutuf::VisualQuery::Base.new('columns' => [{'rel_name' => "people", 'col_name' => "age", 'save_name' => "people:age"}],
2
+ 'all_columns' => [{'rel_name' => "people", 'col_name' => "age", 'save_name' => "people:age"}],
3
+ 'relations' => [{'rel_name'=>"people", 'row' => 0}],
4
+ 'rows' => [0],
5
+ 'query' => {'name' => "first"},
6
+ 'action' => "create").save
7
+ raise "Can't save SQL fixture query" unless Tutuf::VisualQuery::Base.new('sql' => "SELECT AVG(age) AS average_age FROM people", 'query' => {'name' => "raw_sql"}).save
@@ -0,0 +1,267 @@
1
+ # encoding: utf-8
2
+ require File.dirname(__FILE__) + '/../test_helper'
3
+
4
+ class QueriesControllerTest < ActionController::TestCase
5
+ def setup
6
+ super
7
+ @routes = VisualQuery::Engine.routes
8
+ end
9
+
10
+ def test_index_with_saved_queries
11
+ get :index
12
+ assert_response :success
13
+ assert_template 'index'
14
+ end
15
+
16
+ def test_index_with_no_saved_queries
17
+ Tutuf::VisualQuery::Base.expects(:find_all).returns([])
18
+ get :index
19
+ assert_response :success
20
+ assert_template 'index'
21
+ end
22
+
23
+ def test_show_visually_created
24
+ get :show, :name => "first"
25
+ assert_response :success
26
+ assert_template 'show'
27
+ end
28
+
29
+ def test_show_created_with_raw_sql
30
+ get :show, :name => "raw_sql"
31
+ assert_response :success
32
+ assert_template 'show'
33
+ end
34
+
35
+ def test_show_for_nonexisting_name
36
+ get :show, :name => "nonexisting query"
37
+ assert_response 404
38
+ end
39
+
40
+ def test_new
41
+ Tutuf::VisualQuery::Base.stubs(:klasses).returns([Customer])
42
+ get :new
43
+ assert_response :success
44
+ assert_template 'new'
45
+ end
46
+
47
+ def test_list_joinable
48
+ get :list_joinable, :klass => "Customer"
49
+ assert_response :success
50
+ end
51
+
52
+ def test_join_data
53
+ get :join_data, :klass => "Person"
54
+ assert_response :success
55
+ # TODO: output is JSON, how to test it???
56
+ end
57
+
58
+ def test_columns
59
+ get :columns, :klass => "Person"
60
+ assert_response :success
61
+ assert_select ".columns", 1 do
62
+ assert_select ".column", Person.columns.size
63
+ end
64
+ end
65
+
66
+ def test_filter_with_nonblank_schema
67
+ get :filter, :schema => Tutuf::VisualQuery::Base.schema, :rel_name => "first", :col_name => "people:age"
68
+ assert_response :success
69
+ assert_template "_filter"
70
+ end
71
+
72
+ def test_filter_with_blank_schema
73
+ get :filter, :schema => "", :rel_name => "people", :col_name => "age"
74
+ assert_response :success
75
+ end
76
+
77
+ def test_filter_boolean
78
+ get :filter, :schema => "", :rel_name => "customers", :col_name => "vip"
79
+ assert_response :success
80
+ assert_select "input[name='filters[][schema]'][type='hidden'][value='public']", 1
81
+ assert_select "input[name='filters[][rel_name]'][type='hidden'][value='customers']", 1
82
+ assert_select "input[name='filters[][col_name]'][type='hidden'][value='vip']", 1
83
+ assert_select ".filter_condition", 1 do
84
+ assert_select "input[name='filters[][op]'][value='='][type='text'][readonly='readonly']", 1
85
+ assert_select "select[name='filters[][val]']", 1
86
+ end
87
+ end
88
+
89
+ def test_filter_date
90
+ get :filter, :schema => "", :rel_name => "customers", :col_name => "created_at"
91
+ assert_response :success
92
+ assert_select "input[name='filters[][schema]'][type='hidden'][value='public']", 2
93
+ assert_select "input[name='filters[][rel_name]'][type='hidden'][value='customers']", 2
94
+ assert_select "input[name='filters[][col_name]'][type='hidden'][value='created_at']", 2
95
+ assert_select ".filter_condition", 2 do
96
+ assert_select "input[name='filters[][op]'][type='hidden'][value='&gt;=']", 1
97
+ assert_select "input[name='filters[][op]'][type='hidden'][value='&lt;=']", 1
98
+ assert_select "input[name='filters[][val]'][type='text']", 2
99
+ end
100
+ end
101
+
102
+ def test_filter_numeric
103
+ get :filter, :schema => "", :rel_name => "people", :col_name => "age"
104
+ assert_response :success
105
+ assert_select "input[name='filters[][schema]'][type='hidden'][value='public']", 1
106
+ assert_select "input[name='filters[][rel_name]'][type='hidden'][value='people']", 1
107
+ assert_select "input[name='filters[][col_name]'][type='hidden'][value='age']", 1
108
+ assert_select ".filter_condition", 1 do
109
+ assert_select "select[name='filters[][op]']", 1
110
+ assert_select "input[name='filters[][val]']", 1
111
+ end
112
+ end
113
+
114
+ def test_filter_string
115
+ get :filter, :schema => "", :rel_name => "people", :col_name => "name"
116
+ assert_response :success
117
+ assert_select "input[name='filters[][schema]'][type='hidden'][value='public']", 1
118
+ assert_select "input[name='filters[][rel_name]'][type='hidden'][value='people']", 1
119
+ assert_select "input[name='filters[][col_name]'][type='hidden'][value='name']", 1
120
+ assert_select ".filter_condition", 1 do
121
+ assert_select "select[name='filters[][op]']", 1
122
+ assert_select "input[name='filters[][val]']", 1
123
+ end
124
+ end
125
+
126
+ def test_remove_filter
127
+ get :remove_filter, :schema => "", :rel_name => "people", :col_name => "age"
128
+ assert_response :success
129
+ end
130
+
131
+ def common_params
132
+ cols = [{:rel_name => "people", :col_name => "age", :save_name => "people:age"}]
133
+ {:name => '',
134
+ :columns => cols,
135
+ :all_columns => cols,
136
+ :relations => ["people"]}
137
+ end
138
+
139
+ def test_results_csv_non_empty_result_set
140
+ get :results, common_params.merge(:csv => "csv")
141
+ assert_response :success
142
+ assert_equal "text/csv; charset=utf-8; header=present", @response.content_type
143
+ assert @response.headers["Content-Disposition"].match(/^attachment; filename=".+?"$/)
144
+ end
145
+
146
+ def test_results_csv_empty_result_set
147
+ get :results, common_params.merge(:csv => "csv",
148
+ :filters => [ { :rel_name => 'people',
149
+ :col_name => 'age',
150
+ :op => '<',
151
+ :val => '0' } ] )
152
+ assert_response :success
153
+ assert_equal "text/csv; charset=utf-8; header=present", @response.content_type
154
+ assert @response.headers["Content-Disposition"].match(/^attachment; filename=".+?"$/)
155
+ end
156
+
157
+ def test_results_json
158
+ @request.accept = 'application/json'
159
+ get :results, common_params
160
+ assert_response :success
161
+ assert_equal "application/json", @response.content_type
162
+ end
163
+
164
+ def test_results_html_empty_result_set
165
+ Tutuf::VisualQuery::Base.any_instance.expects(:results).returns([])
166
+ get :results, common_params
167
+ assert_response :not_found
168
+ assert_template "_results_empty"
169
+ end
170
+
171
+ def test_results_html_not_large_result_set
172
+ get :results, common_params
173
+ assert_response :success
174
+ assert_template "_results"
175
+ end
176
+
177
+ def test_results_html_large_result_set
178
+ Tutuf::VisualQuery::Base.any_instance.expects(:"large_result_set?").returns(true)
179
+ Tutuf::VisualQuery::Base.any_instance.expects(:results).returns([["age"],["18"]])
180
+
181
+ get :results, common_params
182
+ assert_response :success
183
+ assert_template "_warning_large_result_set"
184
+ end
185
+
186
+ def test_results_hidden_columns_html
187
+ cols = [{:rel_name => "people", :col_name => "name"},
188
+ {:rel_name => "people", :col_name => "age"}]
189
+ get :results,
190
+ :name => '',
191
+ :columns => cols,
192
+ :all_columns => [{:rel_name => "people", :col_name => "id"}] + cols,
193
+ :relations => ["people"]
194
+ assert_response :success
195
+ assert_template "_results"
196
+ end
197
+
198
+ def test_create_invalid
199
+ post :create, common_params, use_route: :visual_query
200
+ assert_response 409
201
+ assert_select ".field_with_errors"
202
+ assert_select ".formError"
203
+ end
204
+
205
+ def test_create_valid
206
+ post :create, common_params.merge({:query=>{:name=>"new query"}})
207
+ assert_response :success
208
+ get :show, :name => "new query"
209
+ assert_response :success
210
+ assert_select "th.relation_column:first-child input[value='people:age'][name='columns[][col_name]']"
211
+ assert_select "th.relation_column:first-child input[value='new query'][name='columns[][rel_name]']"
212
+ assert_select "th.relation_column:first-child input[value='people:age'][name='all_columns[][col_name]']"
213
+ assert_select "th.relation_column:first-child input[value='new query'][name='all_columns[][rel_name]']"
214
+ end
215
+
216
+ def test_destroy_successfully
217
+ delete :destroy, :name => "first"
218
+ assert_response :redirect
219
+ # comparison with root_path fails in Rails 3.2
220
+ assert_redirected_to "/admin/queries/"
221
+ end
222
+
223
+ def test_destroy_unsuccessfully
224
+ Tutuf::VisualQuery::Base.any_instance.expects(:destroy).returns(false)
225
+ delete :destroy, :name => "first"
226
+ assert_response :success
227
+ assert_template "index"
228
+ end
229
+
230
+ def test_new_sql
231
+ get :new_sql
232
+ assert_response :success
233
+ assert_template :sql_form
234
+ assert_select 'input[name=?]', 'query[name]'
235
+ end
236
+
237
+ def test_edit_sql
238
+ get :edit_sql, :name => "raw_sql"
239
+ assert_response :success
240
+ assert_template :sql_form
241
+ assert_select 'input[name=?]', 'query[name]', false
242
+ end
243
+
244
+ def test_update_sql_valid
245
+ put :update_sql, :name => 'first', :sql => "SELECT MAX(age) AS max_age FROM people"
246
+ assert_response :success
247
+ end
248
+
249
+ def test_update_sql_invalid
250
+ put :update_sql, :name => 'first', :sql => "SELECT a FROM "
251
+ assert_response :unprocessable_entity
252
+ end
253
+
254
+ def test_results_sql_valid
255
+ get :results,
256
+ :name => '',
257
+ :sql => "SELECT MAX(age) AS max_age FROM people"
258
+ assert_response :success
259
+ end
260
+
261
+ def test_results_sql_invalid
262
+ get :results,
263
+ :name => '',
264
+ :sql => "SELECT a FROM"
265
+ assert_response :unprocessable_entity
266
+ end
267
+ end