# frozen_string_literal: true

require 'test_helper'

class NotificationPreferencesTest < ActionDispatch::IntegrationTest
  def setup
    @admin = User.find_by(username: 'admin')
    login_as(@admin, scope: :user)
  end

  test 'Index lists all notification preferences for a user' do
    get '/api/notification_preferences'

    # Check response format & status
    assert_equal 200, response.status, response.body
    assert_match Mime[:json].to_s, response.content_type

    # Check the list items are ok and don't include other users' notification preferences
    notification_preferences = json_response(response.body)
    assert_not_equal notification_preferences.count, 0
    assert_equal NotificationPreference.where(user: @admin).count, notification_preferences.count
  end

  test 'update a notification preference' do
    patch '/api/notification_preferences/1',
          params: {
            notification_preference: {
              id: 1,
              user_id: 1,
              notification_type: 'notify_admin_when_project_published',
              in_system: false,
              email: false
            }
          }.to_json,
          headers: default_headers

    # Check response format & status
    assert_equal 200, response.status, response.body
    assert_match Mime[:json].to_s, response.content_type

    # Check the status was updated
    res = json_response(response.body)
    assert_equal 1, res[:id]
    assert_equal 'notify_admin_when_project_published', res[:notification_type]
    assert_equal false, res[:in_system]
    assert_equal false, res[:email]
  end

  test 'bulk update notification preference' do
    patch '/api/notification_preferences/bulk_update',
          params: {
            notification_preferences: [
              {
                id: 1,
                user_id: 1,
                notification_type: 'notify_admin_when_project_published',
                in_system: false,
                email: false
              },
              {
                id: 2,
                user_id: 1,
                notification_type: 'notify_project_collaborator_to_valid',
                in_system: false,
                email: false
              }
            ]
          }.to_json,
          headers: default_headers

    # Check response format & status
    assert_equal 204, response.status, response.body

    # Check records
    first_notification_preference = NotificationPreference.find(1)
    assert_not_nil first_notification_preference, 'notification preference was not found in database'
    assert_equal first_notification_preference.email, false
    assert_equal first_notification_preference.in_system, false

    second_notification_preference = NotificationPreference.find(2)
    assert_not_nil second_notification_preference, 'notification preference was not found in database'
    assert_equal second_notification_preference.email, false
    assert_equal second_notification_preference.in_system, false
  end
end