def test_user(self):
        print_caption("User Resources")

        # GET user list
        response = test_method(self, 'get', resource_url('user'))

        # GET user detail
        response = test_details(self, 'get', response, 'user_list', mandatory_fields=['timezone'])

        # GET user/contact_channel detail
        if response:
            data = data_from_response(response)
            if data['contact_info']:
                test_method(self, 'get', data['contact_info'][0]['url'][len("%s" % (URL_BASE)):])

        # PUT user detail
        if response:
            data = data_from_response(response, ['created', 'contact_info'])
            test_details(self, 'put', response, None, True, data)

        # POST user
        if response:
            data = data_from_response(response, ['created', 'contact_info'])
            data['username'] = data['username'] * 2
            post_response = test_method(self, 'post', resource_url('user'), data)

        # DELETE user detail
        if response:
            test_method(self, 'delete', get_new_object_location(post_response))
    def test_rotating_contact(self):
        print_caption("Rotating Contact Resources")

        # GET rotating_contact list
        response = test_method(self, 'get', resource_url('rotating_contact'))

        # GET rotating_contact detail
        response = test_details(self, 'get', response, 'rotating_contact_list')

        # GET active rotating_contact list
        if response: 
            test_details(self, 'get', response, None, True, nested_uri='active')

        # PUT rotating_contact detail
        if response:
            data = data_from_response(response)
            test_details(self, 'put', response, None, True, data)

        # POST rotating_contact
        if response:
            data = data_from_response(response)
            post_response = test_method(self, 'post', resource_url('rotating_contact'), data)

        # DELETE rotating_contact detail
        if response:
            test_method(self, 'delete', get_new_object_location(post_response))
    def test_contact(self):
        print_caption("Contact Resources")

        # GET contact list
        response = test_method(self, 'get', resource_url('contact'))

        # GET contact detail
        response = test_details(self, 'get', response, 'contact_list')

        # GET contact/contact_channel detail
        if response:
            data = data_from_response(response)
            if data['contact_info']:
                test_method(self, 'get', data['contact_info'][0]['url'][len("%s" % (URL_BASE)):])

        # PUT contact detail
        if response:
            data = data_from_response(response, ['contact_info'])
            test_details(self, 'put', response, None, True, data)

        # POST contact
        if response:
            data = data_from_response(response, ['contact_info'])
            post_response = test_method(self, 'post', resource_url('contact'), data)

        # DELETE contact detail
        if response:
            test_method(self, 'delete', get_new_object_location(post_response))
    def test_outage(self):
        print_caption("Outage Resources")

        # GET active outage list
        test_method(self, 'get', resource_url('outage/active'))

        # GET outage list
        response = test_method(self, 'get', resource_url('outage'))

        # GET outage detail
        response = test_details(self, 'get', response, 'outage_list')

        # GET outage log list
        if response: 
            log_response = test_details(self, 'get', response, None, True, nested_uri='outage_log')
            if log_response:
                data = data_from_response(log_response, ['timestamp', 'user_name'], list_root='outage_log_list', mandatory_fields=['user'])
                test_details(self, 'post', response, None, True, data, nested_uri='outage_log')
        
        # Public alike methods
        if response:
            delay = 300
            data = {
                'who': api_server.UserResource().get_url(masterdb.User.select()[0].id)        
            }

            # PUT acknowledge outage
            test_details(self, 'put', response, None, True, data, nested_uri='acknowledge')

            # PUT delay outage
            test_details(self, 'put', response, None, True, data, nested_uri='delay/%s' % delay)

            # PUT escalate outage
            test_details(self, 'put', response, None, True, data, nested_uri='escalate')
    def test_meta(self):
        print_caption("META Resources")

        # GET monitoring_node list
        response = test_method(self, 'get', resource_url('monitoring_node'))

        # GET monitoring_node detail
        response = test_details(self, 'get', response, 'monitoring_node_list')


        # GET agent_resource_type list
        response = test_method(self, 'get', resource_url('agent_resource_type'))

        # GET agent_resource_type detail
        response = test_details(self, 'get', response, 'agent_resource_type_list')


        # GET network_service_type list
        response = test_method(self, 'get', resource_url('network_service_type'))

        # GET network_service_type detail
        response = test_details(self, 'get', response, 'network_service_type_list', mandatory_fields=['options'])

        # GET network_service_type option detail
        if response: 
            response = test_details(self, 'get', response, 'options')


        # GET contact_type list
        response = test_method(self, 'get', resource_url('contact_type'))

        # GET contact_type detail
        response = test_details(self, 'get', response, 'contact_type_list')
    def test_swagger_doc(self):
        print_caption("Swagger Document")

        # GET schema resource list
        response = test_method(self, 'get', resource_url('schema/resources'))

        # GET customer detail
        data = data_from_response(response)
        for api in data['apis']:
            test_method(self, 'get', resource_url(api['path'].strip("/")))
    def test_timezone(self):
        print_caption("Timezone Resources")

        # GET timezone list
        response = test_method(self, 'get', resource_url('timezone'))

        # GET timezone detail
        response = test_details(self, 'get', response, 'timezone_list')
    def test_maintenance_schedule(self):
        print_caption("Maintenance Schedule Resources")

        # GET active maintenance_schedule list
        test_method(self, 'get', resource_url('maintenance_schedule/active'))

        # GET maintenance_schedule list
        response = test_method(self, 'get', resource_url('maintenance_schedule'))

        # GET maintenance_schedule detail
        response = test_details(self, 'get', response, 'maintenance_schedule_list', mandatory_fields=['targets'])

        # PUT maintenance_schedule detail
        if response:
            data = data_from_response(response, ['next_start_time', 'original_start_time'])
            test_details(self, 'put', response, None, True, data)

        # POST maintenance_schedule
        if response:
            data = data_from_response(response, ['next_start_time', 'original_start_time'])
            post_response = test_method(self, 'post', resource_url('maintenance_schedule'), data)

        # DELETE maintenance_schedule detail
        if response:
            test_method(self, 'delete', get_new_object_location(post_response))


        if response:
            num_minutes = 5

            # PUT pause schedule
            test_details(self, 'put', response, None, True, nested_uri='pause')

            # PUT resume schedule
            test_details(self, 'put', response, None, True, nested_uri='resume')

            # PUT extend schedule
            test_details(self, 'put', response, None, True, nested_uri='extend/%s' % num_minutes)

            # PUT resume schedule
            test_details(self, 'put', response, None, True, nested_uri='terminate')
    def test_public(self):
        print_caption("Public Resources")

        hash = masterdb.EmailAlert.select()[0].hash
        delay = 300
        data = {
            'who': api_server.UserResource().get_url(masterdb.User.select()[0].id)        
        }

        # GET acknowledge outage
        test_method(self, 'get', resource_url('public/outage/%s/acknowledge' % hash), data)

        # GET delay outage
        test_method(self, 'get', resource_url('public/outage/%s/delay/%s' % (hash, delay)), data)

        # GET escalate outage
        test_method(self, 'get', resource_url('public/outage/%s/escalate' % hash), data)

        # PUT acknowledge outage
        test_method(self, 'put', resource_url('public/outage/%s/acknowledge' % hash), data)

        # PUT delay outage
        test_method(self, 'put', resource_url('public/outage/%s/delay/%s' % (hash, delay)), data)

        # PUT escalate outage
        test_method(self, 'put', resource_url('public/outage/%s/escalate' % hash), data)
    def test_customer(self):
        print_caption("Customer Resources")

        # GET customer list
        response = test_method(self, 'get', resource_url('customer'))

        # GET customer detail
        response = test_details(self, 'get', response, 'customer_list', mandatory_fields=["brand"])

        # PUT customer detail
        if response:
            data = data_from_response(response, ['customer_key'])
            test_details(self, 'put', response, None, True, data)

        # POST customer
        if response:
            data = data_from_response(response, ['customer_key', 'status'])
            post_response = test_method(self, 'post', resource_url('customer'), data)

        # DELETE customer detail
        if response:
            test_method(self, 'delete', get_new_object_location(post_response))
    def test_notification_schedule(self):
        print_caption("Notification Schedule Resources")

        # GET notification_schedule list
        response = test_method(self, 'get', resource_url('notification_schedule'))

        # GET notification_schedule detail
        response = test_details(self, 'get', response, 'notification_schedule_list', mandatory_fields=['targets', 'actions'])

        # POST notification_schedule
        if response:
            data = data_from_response(response)
            post_response = test_method(self, 'post', resource_url('notification_schedule'), data)

        # DELETE notification_schedule detail
        if response:
            test_method(self, 'delete', get_new_object_location(post_response))

        # PUT notification_schedule detail
        if response:
            data = data_from_response(response)
            test_details(self, 'put', response, None, True, data)
    def test_email_report(self):
        print_caption("Email Report Resources")

        # GET email_report list
        response = test_method(self, 'get', resource_url('email_report'))

        # GET email_report detail
        response = test_details(self, 'get', response, 'email_report_list')

        # PUT email_report detail
        if response:
            data = data_from_response(response, ['next_send_time'])
            test_details(self, 'put', response, None, True, data)

        # POST email_report
        if response:
            data = data_from_response(response, ['next_send_time'])
            post_response = test_method(self, 'post', resource_url('email_report'), data)

        # DELETE email_report detail
        if response:
            test_method(self, 'delete', get_new_object_location(post_response))
    def test_contact_group(self):
        print_caption("Contact Group Resources")

        # GET contact_group list
        response = test_method(self, 'get', resource_url('contact_group'))

        # GET contact_group detail
        response = test_details(self, 'get', response, 'contact_group_list')

        # PUT contact_group detail
        if response:
            data = data_from_response(response)
            test_details(self, 'put', response, None, True, data)

        # POST contact_group
        if response:
            data = data_from_response(response)
            post_response = test_method(self, 'post', resource_url('contact_group'), data)

        # DELETE contact_group detail
        if response:
            test_method(self, 'delete', get_new_object_location(post_response))
    def test_compound_service(self):
        print_caption("Compound Service Resources")

        # GET compound_service list
        response = test_method(self, 'get', resource_url('compound_service'))

        # GET compound_service detail
        response = test_details(self, 'get', response, 'compound_service_group_list', mandatory_fields=['notification_schedule', 'network_services'])

        # PUT compound_service detail
        if response:
            data = data_from_response(response, ['created'])
            test_details(self, 'put', response, None, True, data)

        # POST compound_service
        if response:
            data = data_from_response(response, ['status', 'created'])
            post_response = test_method(self, 'post', resource_url('compound_service'), data)

        # DELETE compound_service detail
        if response:
            test_method(self, 'delete', get_new_object_location(post_response))
    def test_server_group(self):
        print_caption("Server Group Resources")

        # GET server_group list
        response = test_method(self, 'get', resource_url('server_group'))

        # GET server_group detail-
        response = test_details(self, 'get', response, 'server_group_list', mandatory_fields=['notification_schedule'])

        # PUT server_group detail
        if response:
            data = data_from_response(response)
            test_details(self, 'put', response, None, True, data)

        # POST server_group
        if response:
            data = data_from_response(response)
            post_response = test_method(self, 'post', resource_url('server_group'), data)

        # DELETE server_group detail
        if response:
            test_method(self, 'delete', get_new_object_location(post_response))


        # GET server_group server list
        if response: 
            test_details(self, 'get', response, None, True, nested_uri='server')


        # GET server_group compound_service list
        if response: 
            test_details(self, 'get', response, None, True, nested_uri='compound_service')


        # GET server_group server_group list
        if response: 
            test_details(self, 'get', response, None, True, nested_uri='server_group')
    def test_server(self):
        print_caption("Server Resources")

        # GET server list
        response = test_method(self, 'get', resource_url('server'))

        # GET server detail
        response = test_details(self, 'get', response, 'server_list', mandatory_fields=['notification_schedule', 'primary_monitoring'])

        # PUT server detail
        if response:
            data = data_from_response(response, ['additional_fqdns', 'agent_installed', 'agent_version', 'created'])
            test_details(self, 'put', response, None, True, data)

        # POST server
        if response:
            data = data_from_response(response, ['additional_fqdns', 'agent_installed', 'agent_version', 'created', 'server_key', 'status'])
            post_response = test_method(self, 'post', resource_url('server'), data)

        # DELETE server detail
        if response:
            test_method(self, 'delete', get_new_object_location(post_response))


        # GET server availability
        if response: 
            time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            data = {
                'start_time': time,
                'end_time': time            
            }
            test_details(self, 'get', response, None, True, data, nested_uri='availability')


        # GET server child_server list
        if response: 
            test_details(self, 'get', response, None, True, nested_uri='child_server')


        # GET server child_compound_service list
        if response: 
            test_details(self, 'get', response, None, True, nested_uri='child_compound_service')


        # GET server network_service list
        network_service_response = None
        if response: 
            network_service_response = test_details(self, 'get', response, None, True, nested_uri='network_service')

        # GET server network_service detail
        if network_service_response: 
            network_service_response = test_details(self, 'get', network_service_response, 'network_service_list', mandatory_fields=['metadata'])

        # PUT server network_service detail
        if network_service_response:
            data = data_from_response(network_service_response, ['monitor_node'])
            test_details(self, 'put', network_service_response, None, True, data)

        # POST server network_service
        if network_service_response:
            data = data_from_response(network_service_response, ['monitor_node'])
            post_response = test_details(self, 'post', response, None, True, data, nested_uri='network_service')

        # DELETE server network_service
        if network_service_response:
            test_method(self, 'delete', get_new_object_location(post_response))


        # GET server agent_resource list
        agent_resource_response = None
        if response: 
            agent_resource_response = test_details(self, 'get', response, None, True, nested_uri='agent_resource')

        # GET server agent_resource detail
        if agent_resource_response: 
            agent_resource_response = test_details(self, 'get', agent_resource_response, 'agent_resource_list')

        # PUT server agent_resource detail
        if agent_resource_response:
            data = data_from_response(agent_resource_response, ['agent_resource_type'])
            test_details(self, 'put', agent_resource_response, None, True, data)

        # POST server agent_resource
        if agent_resource_response:
            data = data_from_response(agent_resource_response, ['agent_resource_type'])
            post_response = test_details(self, 'post', response, None, True, data, nested_uri='agent_resource')

        # DELETE server agent_resource detail
        if agent_resource_response:
            test_method(self, 'delete', get_new_object_location(post_response))


        # GET server snmp_resource list
        snmp_resource_response = None
        if response: 
            snmp_resource_response = test_details(self, 'get', response, None, True, nested_uri='snmp_resource')

        # GET server snmp_resource detail
        if snmp_resource_response: 
            snmp_resource_response = test_details(self, 'get', snmp_resource_response, 'snmp_resource_list')

        # PUT server snmp_resource detail
        if snmp_resource_response:
            data = data_from_response(snmp_resource_response, ['snmp_resource_type'])
            test_details(self, 'put', snmp_resource_response, None, True, data)

        # POST server snmp_resource
        if snmp_resource_response:
            data = data_from_response(snmp_resource_response, ['snmp_resource_type'])
            post_response = test_details(self, 'post', response, None, True, data, nested_uri='snmp_resource')

        # DELETE server snmp_resource detail
        if snmp_resource_response:
            test_method(self, 'delete', get_new_object_location(post_response))


        # GET server maintenance_schedule list
        if response: 
            test_details(self, 'get', response, None, True, nested_uri='maintenance_schedule')


        # GET server outage list
        if response: 
            test_details(self, 'get', response, None, True, nested_uri='outage')