# Copyright (c) 2013 Mirantis Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import unittest2
import logging
from login_page import LoginPage
from environments_page import EnvironmentsPage
from selenium import webdriver


logging.basicConfig()
LOG = logging.getLogger(' Tests: ')


def generate_ad(name="test", count=1):
    """
        This function generates parameters for
        Active Directory service
    """
    ad_parameters = {'1-dc_name': name,
                     '1-dc_count': count,
                     '1-adm_password': "P@ssw0rd",
                     '1-recovery_password': "P@ssw0rd2"}
    return ['Active Directory', ad_parameters]

def generate_iis(name="test", domain="test"):
    """
        This function generates parameters for
        Internet Information Services service
    """
    iis_parameters = {'1-iis_name': name,
                      '1-adm_password': "P@ssw0rd",
                      '1-iis_domain': domain}
    return ['Internet Information Services', iis_parameters]


environment_for_deploy = 'environment_for_deploy'


class SanityTests(unittest2.TestCase):
    
    screenshots = 0  # Make screenshots for the end of each test

    @classmethod
    def setUpClass(self):
        """
            Open browser, navigate to the login page,
            login and navigate to the Windows Data Centers page
        """
        driver = webdriver.Firefox()
        self.page = LoginPage(driver)
        self.page.login()

    @classmethod
    def tearDownClass(self):
        """
            Close browser
        """
        self.page.driver.close()

    def setUp(self):
        """
            Navigate to the start page
        """
        self.page.Navigate('Project:Environments')
        self.page = EnvironmentsPage(driver)

    def tearDown(self):
        """
            Make screenshot
        """
        self.screenshots += 1
        self.page.driver.save_screenshot("screen_%s.png" % self.screenshots)

    def test_001_create_environment(self):
        self.page.create_environment('dc1')
        assert self.page.Link('dc1').isPresented()

    def test_002_delete_environment(self):
        self.page.delete_environment('dc1')
        assert not self.page.Link('dc1').isPresented()

    def test_003_configure_environment_before_deploy(self):
        ad_name = "AD.net"
        iis_name = "iis_server"
        self.page.create_environment(environment_for_deploy)
        self.page = self.page.select_environment(environment_for_deploy)

        self.page.create_service(generate_ad(ad_name, 2))
        assert self.page.Link(ad_name).isPresented()

        self.page.create_service(generate_iis(iis_name, ad_name))
        assert self.page.Link(iis_name).isPresented()

    def test_004_deploy_environment(self):
        self.page.deploy_environment(environment_for_deploy)
        status = self.page.get_environment_status(environment_for_deploy)
        assert 'Deploy in progress' in status

    def test_005_create_environments(self):
        for i in range(1, 10):
            name = "environment" + str(i)
            self.page.create_environment(name)
            assert self.page.Link(name).isPresented()

    def test_006_delete_environments(self):
        self.page.delete_environment('environment1')
        self.page.delete_environment('environment9')
        assert not self.page.Link('environment1').isPresented()
        assert not self.page.Link('environment9').isPresented()

        for i in range(2, 9):
            name = 'environment' + str(i)
            assert self.page.Link(name).isPresented()

    def test_007_create_service_ad(self):
        name = "dc001.local"
        self.page.create_environment('test05')
        self.page = self.page.select_environment('test05')
        self.page.create_service(generate_ad(name, 1))
        assert self.page.Link(name).isPresented()

    def test_008_create_service_ad_two_instances(self):
        name = "dc002.local"
        self.page.create_environment('test06')
        self.page = self.page.select_environment('test06')
        self.page.create_service(generate_ad(name, 2))
        assert self.page.Link(name).isPresented()

    def test_009_create_service_ad_with_iis(self):
        ad_name = "dc003.local"
        self.page.create_environment('test07')
        self.page = self.page.select_environment('test07')
        self.page.create_service(generate_ad(ad_name, 3))
        assert self.page.Link(ad_name).isPresented()

        for i in range(5):
            iis_name = 'iis_server' + str(i)
            self.page.create_service(generate_iis(iis_name, ad_name))
            assert self.page.Link(iis_name).isPresented()

    def test_010_delete_environment_with_services(self):
        name = "test07"
        self.page.delete_environment(name)
        assert not self.page.Link(name).isPresented()

    def test_011_service_deploy_in_progress_status(self):
        ad_name = "AD.net"
        iis_name = "iis_server"
        self.page = self.page.select_environment(environment_for_deploy)
        ad_status = self.page.get_service_status(ad_name)
        iis_status = self.page.get_service_status(iis_name)

        assert 'Deploy in progress' in ad_status
        assert 'Deploy in progress' in iis_status

    def test_012_show_service_details_for_deploy(self):
        ad_name = "AD.net"
        iis_name = "iis_server"
        self.page = self.page.select_environment(environment_for_deploy)
        self.page = self.page.select_service(iis_name)
        name = self.page.get_service_name()
        domain = self.page.get_service_domain()

        assert name == iis_name
        assert name == ad_name


if __name__ == '__main__':
    unittest2.main()