#// Copyright (c) 2000-2017 Ericsson Telecom AB                                                         //
#// All rights reserved. This program and the accompanying materials are made available under the terms //
#// of the Eclipse Public License v1.0 which accompanies this distribution, and is available at         //
#// http://www.eclipse.org/legal/epl-v10.html                                                           //
#/////////////////////////////////////////////////////////////////////////////////////////////////////////
import unittest, json
import Microservices.Authentication
from test.utils.Utils import *

class AuthenticationHandlerTest(unittest.TestCase):

    def setUp(self):
        # the "microservice" under test
        self.handler = Microservices.Authentication.createHandler('src/Microservices/Authentication')
        # the datasource handlers of the microservice
        self.datasourceHandlers = self.handler.getDataSourceHandlers()
        # mocked usar "database"
        self.handler._userHandler._userGroups = {
            "users": {
                "admin": [
                    "admin"
                ]
            },
            "groups": [
                "admin"
            ]
        }
        # we do not save the "database"
        self.handler._userHandler._saveUserGroups = lambda *args: None

    def tearDown(self):
        # close tested "microservice"
        self.handler.close()

    def test_authentication(self):
        '''
        Author: EDNIGBO Daniel Gobor
        Testcase: test_authentication
        Tested component: ServiceFramework
        Feature: ServiceFramework - Authentication
        Requirement: authentication and session handling
        Action_To_Be_taken:
            check empty credentials if there is no cookie
            login
            check set cookie header
            check user credentials with valid cookie
            logout
            check logout success
            check user credentials with old cookie
        Expected_Result: pass
        '''

        # check empty credentials if there is no cookie
        credentials = self.handler.getUserCredentials({'cookie': None})
        self.assertEqual(credentials, NO_USER)
        # login
        response = getEmptyResponse()
        self.handler.handleMessage('POST', 'login/api.authenticate', {}, '{"username": "admin", "password": "admin"}', NO_USER, response)
        # check set cookie header
        self.assertEqual(200, response['returnCode'])
        self.assertIn('Set-Cookie', response['headers'])
        self.assertIn('PYSESSID=', response['headers']['Set-Cookie'])
        self.assertIn('Path=/;', response['headers']['Set-Cookie'])
        self.assertIn('expires=', response['headers']['Set-Cookie'])
        # check user credentials with valid cookie
        cookie = response['headers']['Set-Cookie'].split(';')[0] + ';'
        credentials = self.handler.getUserCredentials({'cookie': cookie})
        self.assertEqual(credentials['username'], 'admin')
        self.assertEqual(credentials['password'], 'admin')
        # logout
        response = getEmptyResponse()
        self.handler.handleMessage('POST', 'logout/api.authenticate', {'cookie': cookie}, '', credentials, response)
        # check logout success
        self.assertEqual(200, response['returnCode'])
        self.assertIn('Set-Cookie', response['headers'])
        self.assertIn('PYSESSID=', response['headers']['Set-Cookie'])
        self.assertIn('Path=/;', response['headers']['Set-Cookie'])
        self.assertIn('expires=Thu, 01 Jan 1970 00:00:00 UTC;', response['headers']['Set-Cookie'])
        # check user credentials with old cookie
        credentials = self.handler.getUserCredentials({'cookie': cookie})
        self.assertEqual(credentials, NO_USER)

    def test_userHandling(self):
        '''
        Author: EDNIGBO Daniel Gobor
        Testcase: test_userHandling
        Tested component: ServiceFramework
        Feature: ServiceFramework - Authentication
        Requirement: user handling
        Action_To_Be_taken:
            create 'test_group' group
            check if 'test_group' exists
            add 'test_user[1-3]' users to 'test_group'
            check if the users are in 'test_group'
            check the groups of 'test_user2'
            remove 'test_user2' from the 'test_group'
            check if 'test_user2' was removed from 'test_group'
            check the groups of 'test_user2'
            delete 'test_group'
            check if 'test_group' was deleted
        Expected_Result: pass
        '''

        # create 'test_group' group
        self.set('AddGroup', 'test_group', 4)
        # check if 'test_group' exists
        groups = [element['node']['val'] for element in self.get('ListGroups')['list']]
        self.assertIn('test_group', groups)
        # add 'test_user[1-3]' users to 'test_group'
        self.set('AddUserToGroup', 'test_user1', 4, None, 'test_group')
        self.set('AddUserToGroup', 'test_user2', 4, None, 'test_group')
        self.set('AddUserToGroup', 'test_user3', 4, None, 'test_group')
        # check if the users are in 'test_group'
        users = [element['node']['val'] for element in self.get('ListUsersInGroup', None, 'test_group')['list']]
        self.assertIn('test_user1', users)
        self.assertIn('test_user2', users)
        self.assertIn('test_user3', users)
        self.assertEqual(3, len(users))
        # check the groups of 'test_user2'
        groupsOfUser = [element['node']['val'] for element in self.get('ListGroupsOfUser', 'test_user2')['list']]
        self.assertIn('test_group', groupsOfUser)
        self.assertEqual(1, len(groupsOfUser))
        # remove 'test_user2' from the 'test_group'
        self.set('RemoveUserFromGroup', '', 1, 'test_user2', 'test_group')
        # check if 'test_user2' was removed from 'test_group'
        users = [element['node']['val'] for element in self.get('ListUsersInGroup', None, 'test_group')['list']]
        self.assertIn('test_user1', users)
        self.assertNotIn('test_user2', users)
        self.assertIn('test_user3', users)
        self.assertEqual(2, len(users))
        # check the groups of 'test_user2'
        groupsOfUser = [element['node']['val'] for element in self.get('ListGroupsOfUser', 'test_user2')['list']]
        self.assertEqual(0, len(groupsOfUser))
        # delete 'test_group'
        self.set('RemoveGroup', '', 1, None, 'test_group')
        # check if 'test_group' was deleted
        groups = [element['node']['val'] for element in self.get('ListGroups')['list']]
        self.assertNotIn('test_group', groups)
        groupsOfUser = [element['node']['val'] for element in self.get('ListGroupsOfUser', 'test_user1')['list']]
        self.assertEqual(0, len(groupsOfUser))

    def test_groupHandling(self):
        '''
        Author: EDNIGBO Daniel Gobor
        Testcase: test_userHandling
        Tested component: ServiceFramework
        Feature: ServiceFramework - Authentication
        Requirement: user group handling
        Action_To_Be_taken:
            add 'test_group' group
            add 'admin' user to the group
            login as admin
            check if credentials are correct
        Expected_Result: pass
        '''

        # add 'test_group' group
        self.set('AddGroup', 'test_group', 4)
        # add 'admin' user to the group
        self.set('AddUserToGroup', 'admin', 4, None, 'test_group')
        # login as admin
        response = getEmptyResponse()
        self.handler.handleMessage('POST', 'login/api.authenticate', {}, '{"username": "admin", "password": "admin"}', NO_USER, response)
        # check if credentials are correct
        cookie = response['headers']['Set-Cookie'].split(';')[0] + ';'
        credentials = self.handler.getUserCredentials({'cookie': cookie})
        self.assertEqual(credentials['username'], 'admin')
        self.assertEqual(credentials['password'], 'admin')
        self.assertIn('test_group', credentials['groups'])

    def test_help(self):
        '''
        Author: EDNIGBO Daniel Gobor
        Testcase: test_help
        Tested component: ServiceFramework
        Feature: ServiceFramework - Authentication
        Requirement: datasource help in Authentication
        Action_To_Be_taken:
            get help
            check help syntax
        Expected_Result: pass
        '''

        # get help
        help = self.get('help')['node']['val']
        # check help syntax
        json.loads(help.decode('hex'))

    def get(self, element, user = None, group = None):
        request = {
            'source': self.handler.SOURCE_ID,
            'element': element,
            'params': []
        }
        if user is not None:
            request['params'].append({
                'paramName': 'User',
                'paramValue': user
            })
        if group is not None:
            request['params'].append({
                'paramName': 'Group',
                'paramValue': group
            })
        return self.datasourceHandlers[self.handler.SOURCE_ID]['getDataHandler'](request, ADMIN)

    def set(self, element, content, tp, user = None, group = None):
        request = {
            'source': self.handler.SOURCE_ID,
            'element': element,
            'params': [],
            'tp': tp,
            'content': content
        }
        if user is not None:
            request['params'].append({
                'paramName': 'User',
                'paramValue': user
            })
        if group is not None:
            request['params'].append({
                'paramName': 'Group',
                'paramValue': group
            })
        return self.datasourceHandlers[self.handler.SOURCE_ID]['setDataHandler'](request, ADMIN)
