require 'test_helper' require 'faker'

class {{ NAMESPACE }}ControllerTest < ActionDispatch::IntegrationTest

def model 
  "{{ MODEL }}".singularize.camelize.constantize
end

def get_columns
  model.columns_hash.map { |k, v| { key: k.to_sym, data_type: v.type }  }
end

def data_types val
  lookup = {
    string: Faker::Lorem.sentence.to_s,
    datetime: DateTime.now,
    integer: 1,
    boolean: false,
    text: Faker::Lorem.paragraph.to_s,
  }
  lookup[val] || nil
end

def black_list_keys
  {
    id: true,
    created_at: true,
    updated_at: true,
  }
end

def set_data_values
  get_columns.each_with_object({}) do |e, acc|
    key = e[:key]
    val = e[:data_type]
    if !black_list_keys[key]
        acc[key] = data_types(val)
    end
    acc
  end
end

def random_params
  set_data_values
end

setup do
  @data = model.create(random_params)
end

test "should create {{ NAMESPACE_SNAKECASE }}" do
  post '{{ ROUTE }}', params: random_params
  assert_response :created
end

test "should get index {{ NAMESPACE_SNAKECASE }}" do
  get '{{ ROUTE }}'
  assert_response :success
end

test "should show {{ NAMESPACE_SNAKECASE }}" do
  get "{{ ROUTE }}/#{@data.id}"
  assert_response :success
end

test "should put update {{ NAMESPACE_SNAKECASE }}" do
  put "{{ ROUTE }}/#{@data.id}", params: random_params
  assert_response :success
end

test "should patch update {{ NAMESPACE_SNAKECASE }}" do
  patch "{{ ROUTE }}/#{@data.id}", params: random_params
  assert_response :success
end

test "should destroy {{ NAMESPACE_SNAKECASE }}" do
  delete "{{ ROUTE }}/#{@data.id}"
  assert_response :no_content
end

end