# coding: utf-8

# Import python libs
from __future__ import absolute_import
import os

# Import salttesting libs
from salttesting.unit import skipIf
from salttesting.helpers import (
    ensure_in_syspath,
    destructiveTest)
ensure_in_syspath('../../../')

from tests.utils import BaseRestCherryPyTest

# Import Salt Libs
import integration
import salt.utils

# Import 3rd-party libs
# pylint: disable=import-error,unused-import
from salt.ext.six.moves.urllib.parse import urlencode  # pylint: disable=no-name-in-module
try:
    import cherrypy
    HAS_CHERRYPY = True
except ImportError:
    HAS_CHERRYPY = False
# pylint: enable=import-error,unused-import

USERA = 'saltdev'
USERA_PWD = 'saltdev'
SET_USERA_PWD = '$6$SALTsalt$ZZFD90fKFWq8AGmmX0L3uBtS9fXL62SrTk5zcnQ6EkD6zoiM3kB88G1Zvs0xm/gZ7WXJRs5nsTBybUvGSqZkT.'

auth_creds = {
    'username': USERA,
    'password': USERA_PWD,
    'eauth': 'pam'}

@skipIf(HAS_CHERRYPY is False, 'CherryPy not installed')
class TestAuthPAM(BaseRestCherryPyTest, integration.ModuleCase):
    '''
    Test auth with pam using salt-api
    '''

    @destructiveTest
    @skipIf(os.geteuid() != 0, 'You must be logged in as root to run this test')
    def setUp(self):
        super(TestAuthPAM, self).setUp()
        try:
            add_user = self.run_function('user.add', [USERA], createhome=False)
            add_pwd = self.run_function('shadow.set_password', [USERA, SET_USERA_PWD])
            self.assertTrue(add_user)
            self.assertTrue(add_pwd)
            user_list = self.run_function('user.list_users')
            self.assertIn(USERA, str(user_list))
        except AssertionError:
                self.run_function('user.delete', [USERA], remove=True)
                self.skipTest(
                    'Could not add user or password, skipping test'
                )

    def test_bad_pwd_pam_chsh_service(self):
        '''
        Test login while specifying chsh service with bad passwd
        This test ensures this PR is working correctly:
        https://github.com/saltstack/salt/pull/31826
        '''
        copyauth_creds = auth_creds.copy()
        copyauth_creds['service'] = 'chsh'
        copyauth_creds['password'] = 'wrong_password'
        body = urlencode(copyauth_creds)
        request, response = self.request('/login', method='POST', body=body,
            headers={
                'content-type': 'application/x-www-form-urlencoded'
        })
        self.assertEqual(response.status, '401 Unauthorized')

    def test_bad_pwd_pam_login_service(self):
        '''
        Test login while specifying login service with bad passwd
        This test ensures this PR is working correctly:
        https://github.com/saltstack/salt/pull/31826
       '''
        copyauth_creds = auth_creds.copy()
        copyauth_creds['service'] = 'login'
        copyauth_creds['password'] = 'wrong_password'
        body = urlencode(copyauth_creds)
        request, response = self.request('/login', method='POST', body=body,
            headers={
                'content-type': 'application/x-www-form-urlencoded'
        })
        self.assertEqual(response.status, '401 Unauthorized')

    def test_good_pwd_pam_chsh_service(self):
        '''
        Test login while specifying chsh service with good passwd
        This test ensures this PR is working correctly:
        https://github.com/saltstack/salt/pull/31826
        '''
        copyauth_creds = auth_creds.copy()
        copyauth_creds['service'] = 'chsh'
        body = urlencode(copyauth_creds)
        request, response = self.request('/login', method='POST', body=body,
            headers={
                'content-type': 'application/x-www-form-urlencoded'
        })
        self.assertEqual(response.status, '200 OK')

    def test_good_pwd_pam_login_service(self):
        '''
        Test login while specifying login service with good passwd
        This test ensures this PR is working correctly:
        https://github.com/saltstack/salt/pull/31826
        '''
        copyauth_creds = auth_creds.copy()
        copyauth_creds['service'] = 'login'
        body = urlencode(copyauth_creds)
        request, response = self.request('/login', method='POST', body=body,
            headers={
                'content-type': 'application/x-www-form-urlencoded'
        })
        self.assertEqual(response.status, '200 OK')

    @destructiveTest
    @skipIf(os.geteuid() != 0, 'You must be logged in as root to run this test')
    def tearDown(self, grains=None):
        '''
        Clean up after tests. Delete user
        '''
        user_list = self.run_function('user.list_users')
        # Remove saltdev user
        if USERA in user_list:
            self.run_function('user.delete', [USERA], remove=True)

@@ -8,16 +8,81 @@
 g: utf-8
+%0A'''%0AIntegration Tests for restcherry salt-api with pam eauth%0A'''
 %0A%0A# Impo
@@ -878,26 +878,26 @@
 qZkT.'%0A%0A
-auth_creds
+AUTH_CREDS
  = %7B%0A   
@@ -1460,16 +1460,56 @@
 ssword',
+%0A                                       
  %5BUSERA,
@@ -1745,36 +1745,32 @@
 or:%0A            
-    
 self.run_functio
@@ -1816,28 +1816,24 @@
             
-    
 self.skipTes
@@ -1835,20 +1835,16 @@
 ipTest(%0A
-    
         
@@ -2182,34 +2182,34 @@
 uth_creds = 
-auth_creds
+AUTH_CREDS
 .copy()%0A    
@@ -2848,34 +2848,34 @@
 uth_creds = 
-auth_creds
+AUTH_CREDS
 .copy()%0A    
@@ -3516,34 +3516,34 @@
 uth_creds = 
-auth_creds
+AUTH_CREDS
 .copy()%0A    
@@ -4125,26 +4125,26 @@
 creds = 
-auth_creds
+AUTH_CREDS
 .copy()%0A
@@ -4553,32 +4553,32 @@
 run this test')%0A
+
     def tearDown
@@ -4586,21 +4586,8 @@
 self
-, grains=None
 ):%0A 

fix pylint error