require 'test_helper'

class VLansControllerTest < ActionController::TestCase
  include Devise::TestHelpers

  setup do
    @user = users(:one)
    @user.is_super_admin = true
    @user.save!
    sign_in @user

    @network = location_networks(:one)
    @network.organisation_id = @user.organisation_id
    @network.save!

    @v_lan = v_lans(:one)
    @v_lan.organisation_id = @user.organisation_id
    @v_lan.location_network_id = @network.id
    @v_lan.v_lan_id = "1"
    @v_lan.save!
  end

  test "should get index" do
    get :index
    assert_response :success
    assert_not_nil assigns(:v_lans)
  end

  test "should get new" do
    get :new
    assert_response :success
  end

  test "should create v_lan" do
    assert_difference('VLan.count') do
      post :create, v_lan: { dhcp_end_range: @v_lan.dhcp_end_range, dhcp_start_range: @v_lan.dhcp_start_range, dns1: @v_lan.dns1, dns2: @v_lan.dns2, gateway: @v_lan.gateway, ip_address: @v_lan.ip_address, ip_type: @v_lan.ip_type, net_mask: @v_lan.net_mask, network_ssid_id: @v_lan.network_ssid_id, organisation_id: @v_lan.organisation_id, v_lan_id: "2" }
    end

    assert_redirected_to v_lan_path(assigns(:v_lan))
  end

  test "should show v_lan" do
    get :show, id: @v_lan
    assert_response :success
  end

  test "should get edit" do
    get :edit, id: @v_lan
    assert_response :success
  end

  test "should update v_lan" do
    patch :update, id: @v_lan, v_lan: { dhcp_end_range: @v_lan.dhcp_end_range, dhcp_start_range: @v_lan.dhcp_start_range, dns1: @v_lan.dns1, dns2: @v_lan.dns2, gateway: @v_lan.gateway, ip_address: @v_lan.ip_address, ip_type: @v_lan.ip_type, net_mask: @v_lan.net_mask, network_ssid_id: @v_lan.network_ssid_id, organisation_id: @v_lan.organisation_id, v_lan_id: @v_lan.v_lan_id }
    assert_redirected_to v_lan_path(assigns(:v_lan))
  end

  test "should destroy v_lan" do
    assert_difference('VLan.count', -1) do
      delete :destroy, id: @v_lan
    end

    assert_redirected_to v_lans_path
  end

  test "should add dhcp mapping via API" do
    @v_lan.v_lan_id = "10"
    @v_lan.ip_address = "192.168.1.1"
    @v_lan.net_mask = "255.255.255.0"
    @v_lan.gateway = "192.168.1.254"
    @v_lan.dhcp_mappings = []
    @v_lan.save!

    post :add_dhcp_mapping, {
      network_id: @network.id,
      vlan_id: @v_lan.v_lan_id,
      IPADDR: "192.168.1.15",
      MAC: "00:11:22:33:44:55",
      format: :json
    }

    assert_response :success
    json = JSON.parse(response.body)
    assert_equal 200, json['status']
    assert_equal "192.168.1.15", json['data']['dhcp_mappings'].last['IPADDR']
    assert_equal "00:11:22:33:44:55", json['data']['dhcp_mappings'].last['MAC']
  end

  test "should fail to add invalid dhcp mapping via API" do
    @v_lan.v_lan_id = "10"
    @v_lan.ip_address = "192.168.1.1"
    @v_lan.net_mask = "255.255.255.0"
    @v_lan.gateway = "192.168.1.254"
    @v_lan.dhcp_mappings = []
    @v_lan.save!

    post :add_dhcp_mapping, {
      network_id: @network.id,
      vlan_id: @v_lan.v_lan_id,
      IPADDR: "192.168.2.15",
      MAC: "00:11:22:33:44:55",
      format: :json
    }

    assert_response 422
    json = JSON.parse(response.body)
    assert_equal 422, json['status']
    assert_match /IP Address is not in the range of IP and Gateway fields!/, json['message']
  end
end
