module VisualizationControllerHelper include Rack::Test::Methods include Warden::Test::Helpers include CacheHelper TEST_UUID = '00000000-0000-0000-0000-000000000000'.freeze DATE_ATTRIBUTES = %w{ created_at updated_at }.freeze NORMALIZED_ASSOCIATION_ATTRIBUTES = { attributes: DATE_ATTRIBUTES, associations: { 'permission' => { attributes: DATE_ATTRIBUTES, associations: {} }, 'table' => { attributes: DATE_ATTRIBUTES, associations: {} } } }.freeze NEW_ATTRIBUTES = { attributes: [], associations: { 'table' => { attributes: [], associations: { 'permission' => { attributes: [], associations: { 'owner' => { attributes: ['email', 'quota_in_bytes', 'db_size_in_bytes', 'public_visualization_count', 'all_visualization_count', 'table_count'], associations: {} } } } } }, 'permission' => { attributes: [], associations: { 'owner' => { attributes: ['email', 'quota_in_bytes', 'db_size_in_bytes', 'public_visualization_count', 'all_visualization_count', 'table_count'], associations: {} } } } } }.freeze # Custom hash comparison, since in the ActiveModel-based controllers # we allow some differences: # - x to many associations can return [] instead of nil def normalize_hash(h, normalized_attributes = NORMALIZED_ASSOCIATION_ATTRIBUTES) h.each { |k, v| h[k] = nil if v == [] h[k] = '' if normalized_attributes[:attributes].include?(k) if normalized_attributes[:associations].keys.include?(k) normalize_hash(v, normalized_attributes[:associations][k]) end } end # INFO: this test uses comparison against old data structures to check validity. # You can use this method to remove that new data so next comparisons will work. def remove_data_only_in_new_controllers(visualization_hash, new_attributes = NEW_ATTRIBUTES) visualization_hash.each { |k, v| if new_attributes[:attributes].include?(k) removed = visualization_hash.delete(k) elsif new_attributes[:associations].include?(k) remove_data_only_in_new_controllers(v, new_attributes[:associations][k]) end } end def login(user) login_as(user, {scope: user.username }) host! "#{user.username}.localhost.lan" end def base_url '/api/v1/viz' end def response_body(params = nil) get base_url, params.nil? ? nil : params.dup, @headers last_response.status.should == 200 body = JSON.parse(last_response.body) body['visualizations'] = body['visualizations'].map { |v| normalize_hash(v) }.map { |v| remove_data_only_in_new_controllers(v) } body end def factory(user, attributes={}) visualization_template(user, attributes) end def table_factory(options={}) create_table_with_options(@user_1, @headers, options) end def api_visualization_creation(user, headers, additional_fields = {}) post api_v1_visualizations_create_url(user_domain: user.username, api_key: user.api_key), factory(user).merge(additional_fields).to_json, headers id = JSON.parse(last_response.body).fetch('id') id.should_not be_nil CartoDB::Visualization::Member.new(id: id).fetch end def test_organization organization = Organization.new organization.name = unique_name('org') organization.quota_in_bytes = 1234567890 organization.seats = 5 organization.builder_enabled = false organization end def create_geometry_table(user, the_geom) table = new_table(privacy: UserTable::PRIVACY_PUBLIC, user_id: user.id) table.force_schema = "the_geom geometry" table.the_geom_type = "point" table.save.reload table.insert_row!(the_geom: the_geom) table.update_bounding_box table end end