# encoding: utf-8
require 'test_helper'

class SessionBasicTest < ActiveSupport::TestCase
  test 'a cache' do
    Sessions::CacheIn.set( 'last_run_test', true, { expires_in: 2.seconds } )
    result = Sessions::CacheIn.get( 'last_run_test' )
    assert_equal( true, result, 'check 1' )

    # should not be expired
    result = Sessions::CacheIn.expired( 'last_run_test' )
    assert_equal( false, result, 'check 1 - expired' )

    # should be expired
    sleep 3
    result = Sessions::CacheIn.expired( 'last_run_test' )
    assert_equal( true, result, 'check 1 - expired' )

    # renew expire
    result = Sessions::CacheIn.get( 'last_run_test', re_expire: true )
    assert_equal( true, result, 'check 1 - re_expire' )

    # should not be expired
    result = Sessions::CacheIn.expired( 'last_run_test' )
    assert_equal( false, result, 'check 1 - expired' )

    # ignore expired
    sleep 3
    result = Sessions::CacheIn.get( 'last_run_test', ignore_expire: true )
    assert_equal( true, result, 'check 1 - ignore_expire' )

    # should be expired
    result = Sessions::CacheIn.expired( 'last_run_test' )
    assert_equal( true, result, 'check 2' )

    result = Sessions::CacheIn.get( 'last_run_test' )
    assert_equal( nil, result, 'check 2' )

    # check delete cache
    Sessions::CacheIn.set( 'last_run_delete', true, { expires_in: 5.seconds } )
    result = Sessions::CacheIn.get( 'last_run_delete' )
    assert_equal( true, result, 'check 1' )
    Sessions::CacheIn.delete( 'last_run_delete' )
    result = Sessions::CacheIn.get( 'last_run_delete' )
    assert_equal( nil, nil, 'check delete' )
  end

  test 'c session create / update' do

    # create users
    roles  = Role.where( name: [ 'Agent'] )
    groups = Group.all

    UserInfo.current_user_id = 1
    agent1 = User.create_or_update(
      login: 'session-agent-1',
      firstname: 'Session',
      lastname: 'Agent 1',
      email: 'session-agent1@example.com',
      password: 'agentpw',
      active: true,
      roles: roles,
      groups: groups,
    )
    agent1.roles = roles
    agent1.save

    # create sessions
    client_id1 = '123456789'
    Sessions.create( client_id1, {}, { type: 'websocket' } )

    # check if session exists
    assert( Sessions.session_exists?(client_id1), 'check if session exists' )

    # check session data
    data = Sessions.get(client_id1)
    assert( data[:meta], 'check if meta exists' )
    assert( data[:user], 'check if user exists' )
    assert_equal( data[:user]['id'], nil, 'check if user id is correct' )

    # recreate session
    Sessions.create( client_id1, agent1.attributes, { type: 'websocket' } )

    # check if session exists
    assert( Sessions.session_exists?(client_id1), 'check if session exists' )

    # check session data
    data = Sessions.get(client_id1)
    assert( data[:meta], 'check if meta exists' )
    assert( data[:user], 'check if user exists' )
    assert_equal( data[:user]['id'], agent1.id, 'check if user id is correct' )

    # destroy session
    Sessions.destory(client_id1)

    # check if session exists
    assert( !Sessions.session_exists?(client_id1), 'check if session exists' )

  end

  test 'c collections group' do
    require 'sessions/backend/collections/group.rb'

    UserInfo.current_user_id = 2
    user = User.lookup(id: 1)
    collection_client1 = Sessions::Backend::Collections::Group.new(user, false, '123-1', 3)
    collection_client2 = Sessions::Backend::Collections::Group.new(user, false, '234-2', 3)

    # get whole collections
    result1 = collection_client1.push
    assert( !result1.empty?, 'check collections' )
    sleep 0.6
    result2 = collection_client2.push
    assert( !result2.empty?, 'check collections' )
    assert_equal( result1, result2, 'check collections' )

    # next check should be empty
    result1 = collection_client1.push
    assert( !result1, 'check collections - recall' )
    sleep 1
    result2 = collection_client2.push
    assert( !result2, 'check collections - recall' )

    # change collection
    group = Group.first
    group.touch
    sleep 4

    # get whole collections
    result1 = collection_client1.push
    assert( !result1.empty?, 'check collections - after touch' )
    result2 = collection_client2.push
    assert( !result2.empty?, 'check collections - after touch' )
    assert_equal( result1, result2, 'check collections' )

    # check again after touch
    result1 = collection_client1.push
    assert( !result1, 'check collections - after touch - recall' )
    result2 = collection_client2.push
    assert( !result2, 'check collections - after touch - recall' )
    assert_equal( result1, result2, 'check collections' )

    # change collection
    group = Group.create( name: 'SomeGroup::' + rand(999_999).to_s, active: true )
    sleep 4

    # get whole collections
    result1 = collection_client1.push
    assert( !result1.empty?, 'check collections - after create' )
    result2 = collection_client2.push
    assert( !result2.empty?, 'check collections - after create' )
    assert_equal( result1, result2, 'check collections' )

    # check again after create
    sleep 4
    result1 = collection_client1.push
    assert( !result1, 'check collections - after create - recall' )
    result2 = collection_client2.push
    assert( !result2, 'check collections - after create - recall' )
    assert_equal( result1, result2, 'check collections' )

    # change collection
    group.destroy
    sleep 4

    # get whole collections
    result1 = collection_client1.push
    assert( !result1.empty?, 'check collections - after destroy' )
    result2 = collection_client2.push
    assert( !result2.empty?, 'check collections - after destroy' )
    assert_equal( result1, result2, 'check collections' )

    # check again after destroy
    sleep 4
    result1 = collection_client1.push
    assert( !result1, 'check collections - after destroy - recall' )
    result2 = collection_client2.push
    assert( !result2, 'check collections - after destroy - recall' )
    assert_equal( result1, result2, 'check collections' )
  end

  user = User.lookup(id: 1)
  roles  = Role.where( name: %w(Agent Admin) )
  user.roles = roles
  user.save

  test 'c collections organization' do
    require 'sessions/backend/collections/organization.rb'
    UserInfo.current_user_id = 2
    user = User.lookup(id: 1)
    org = Organization.create( name: 'SomeOrg1::' + rand(999_999).to_s, active: true )

    collection_client1 = Sessions::Backend::Collections::Organization.new(user, false, '123-1', 3)
    collection_client2 = Sessions::Backend::Collections::Organization.new(user, false, '234-2', 3)

    # get whole collections - should be nil, no org exists!
    result1 = collection_client1.push
    assert( !result1.empty?, 'check collections' )
    result2 = collection_client2.push
    assert( !result2.empty?, 'check collections' )
    assert_equal( result1, result2, 'check collections' )

    # next check - should still be nil, no org exists!
    result1 = collection_client1.push
    assert( !result1, 'check collections - recall' )
    sleep 0.6
    result2 = collection_client2.push
    assert( !result2, 'check collections - recall' )

    # change collection
    org = Organization.create( name: 'SomeOrg2::' + rand(999_999).to_s, active: true )
    sleep 4

    # get whole collections
    result1 = collection_client1.push
    assert( !result1.empty?, 'check collections - after create' )
    result2 = collection_client2.push
    assert( !result2.empty?, 'check collections - after create' )
    assert_equal( result1, result2, 'check collections' )

    sleep 4

    # next check should be empty
    result1 = collection_client1.push
    assert( !result1, 'check collections - after create recall' )
    result2 = collection_client2.push
    assert( !result2, 'check collections - after create recall' )

    organization = Organization.first
    organization.touch
    sleep 4

    # get whole collections
    result1 = collection_client1.push
    assert( !result1.empty?, 'check collections - after touch' )
    result2 = collection_client2.push
    assert( !result1.empty?, 'check collections - after touch' )
    assert_equal( result1, result2, 'check collections' )
  end

  test 'c rss' do
    user = User.lookup(id: 1)
    collection_client1 = Sessions::Backend::Rss.new(user, false, '123-1')

    # get whole collections
    result1 = collection_client1.push
    #puts "RSS1: #{result1.inspect}"
    assert( !result1.empty?, 'check rss' )
    sleep 1

    # next check should be empty
    result1 = collection_client1.push
    #puts "R1: #{result1.inspect}"
    assert( !result1, 'check rss - recall' )
  end

  test 'c activity stream' do

    # create users
    roles  = Role.where( name: %w(Agent Admin) )
    groups = Group.all

    UserInfo.current_user_id = 2
    agent1 = User.create_or_update(
      login: 'activity-stream-agent-1',
      firstname: 'Session',
      lastname: 'activity stream ' + rand(99_999).to_s,
      email: 'activity-stream-agent1@example.com',
      password: 'agentpw',
      active: true,
      roles: roles,
      groups: groups,
    )
    agent1.roles = roles
    assert( agent1.save, 'create/update agent1' )

    as_client1 = Sessions::Backend::ActivityStream.new(agent1, false, '123-1', 3)

    # get as stream
    result1 = as_client1.push
    assert( result1, 'check as agent1' )
    sleep 1

    # next check should be empty
    result1 = as_client1.push
    assert( !result1, 'check as agent1 - recall' )

    # next check should be empty
    sleep 4
    result1 = as_client1.push
    assert( !result1, 'check as agent1 - recall 2' )

    agent1.update_attribute( :email, 'activity-stream-agent11@example.com' )
    ticket = Ticket.create(title: '12323', group_id: 1, priority_id: 1, state_id: 1, customer_id: 1 )

    sleep 4

    # get as stream
    result1 = as_client1.push
    assert( result1, 'check as agent1 - recall 3' )
  end

  test 'c ticket_create' do

    UserInfo.current_user_id = 2
    user = User.lookup(id: 1)
    ticket_create_client1 = Sessions::Backend::TicketCreate.new(user, false, '123-1', 3)

    # get as stream
    result1 = ticket_create_client1.push
    assert( result1, 'check ticket_create' )
    sleep 0.6

    # next check should be empty
    result1 = ticket_create_client1.push
    assert( !result1, 'check ticket_create - recall' )

    # next check should be empty
    sleep 0.6
    result1 = ticket_create_client1.push
    assert( !result1, 'check ticket_create - recall 2' )

    Group.create( name: 'SomeTicketCreateGroup::' + rand(999_999).to_s, active: true )

    sleep 4

    # get as stream
    result1 = ticket_create_client1.push
    assert( result1, 'check ticket_create - recall 3' )
  end

end
