def test_process_dos_results_for_one_good_one_bad_service(mock_data_client):
    declaration_content = mock.Mock()
    question_numbers = mock.PropertyMock(side_effect=[2, 18, 22, -1])
    type(declaration_content.get_question.return_value).number = question_numbers

    content_loader = mock.Mock()
    content_loader.get_manifest.return_value = declaration_content
    # Service fails on essential but second lot service is OK so application should Pass overall
    bad_service = COMPLETE_RESEARCH_PARTICIPANTS_DRAFT.copy()
    bad_service['anonymousRecruitment'] = False
    declaration = OrderedDict([("key1", True), ("key2", False), ("key3", False), ("status", "complete")])
    mock_data_client.get_interested_suppliers.return_value = {"interestedSuppliers": [123456]}
    mock_data_client.get_supplier_declaration.return_value = {"declaration": declaration}
    mock_data_client.find_draft_services_iter.return_value = iter((bad_service, COMPLETE_OUTCOMES_DRAFT,))
    process_dos_results(mock_data_client, content_loader, 'user')
    mock_data_client.set_framework_result.assert_called_with(123456, 'digital-outcomes-and-specialists', True, 'user')
def test_process_dos_results_for_incomplete_declaration(mock_data_client):
    declaration_content = mock.Mock()
    question_numbers = mock.PropertyMock(side_effect=[2, 18, 22, -1])
    type(declaration_content.get_question.return_value).number = question_numbers

    content_loader = mock.Mock()
    content_loader.get_manifest.return_value = declaration_content
    # Declaration not complete so application should fail
    declaration = OrderedDict([("key1", True), ("key2", False), ("key3", False), ("status", "started")])
    mock_data_client.get_interested_suppliers.return_value = {"interestedSuppliers": [123456]}
    mock_data_client.get_supplier_declaration.return_value = {"declaration": declaration}
    mock_data_client.find_draft_services.return_value = {
        "services": [COMPLETE_OUTCOMES_DRAFT, COMPLETE_RESEARCH_PARTICIPANTS_DRAFT]
    }
    process_dos_results(mock_data_client, content_loader, 'user')
    mock_data_client.set_framework_result.assert_called_with(123456, 'digital-outcomes-and-specialists', False, 'user')
def test_process_dos_results_for_successful(mock_data_client):
    declaration_content = mock.Mock()
    question_numbers = mock.PropertyMock(side_effect=[2, 18, 22, -1])
    type(declaration_content.get_question.return_value).number = question_numbers

    content_loader = mock.Mock()
    content_loader.get_manifest.return_value = declaration_content
    # Question 22 = True is a discretionary fail, so result should be discretionary
    declaration = OrderedDict([("key1", True), ("key2", False), ("key3", True), ("status", "complete")])
    mock_data_client.get_interested_suppliers.return_value = {"interestedSuppliers": [123456]}
    mock_data_client.get_supplier_declaration.return_value = {"declaration": declaration}
    mock_data_client.find_draft_services.return_value = {
        "services": [COMPLETE_OUTCOMES_DRAFT, COMPLETE_RESEARCH_PARTICIPANTS_DRAFT]
    }
    process_dos_results(mock_data_client, content_loader, 'user')
    # Discretionary result should not update `supplier_frameworks` at all
    mock_data_client.set_framework_result.assert_not_called()
   - on_framework=false if declaration FAILed or there are no unfailed services
   - on_framework=NULL (no call to API) if declaration DISCRETIONARY and at least one lot not `failed`

Usage:
    scripts/insert-dos-framework-results.py <path_to_frameworks> <stage> --api-token=<data_api_token>

Example:
    python scripts/insert-dos-framework-results.py ../digitalmarkeplace-frameworks dev --api-token=myToken
"""
import sys
sys.path.insert(0, '.')

import getpass
from dmscripts.env import get_api_endpoint_from_stage
from dmutils import content_loader

from docopt import docopt
from dmapiclient import DataAPIClient
from dmscripts.insert_dos_framework_results import process_dos_results
from dmutils.content_loader import ContentLoader

if __name__ == '__main__':
    arguments = docopt(__doc__)

    data_api_url = get_api_endpoint_from_stage(arguments['<stage>'], 'api')
    content_loader = ContentLoader(arguments['<path_to_frameworks>'])
    client = DataAPIClient(data_api_url, arguments['--api-token'])
    user = getpass.getuser()

    process_dos_results(client, content_loader, user)