def test_populate_output_suppliers(mock_data_client):
    """Test supplier info, no lot info."""
    with open(os.path.join(FIXTURES_DIR, 'test_supplier_frameworks_response.json')) as supplier_frameworks_response:
        mock_data_client.find_framework_suppliers.return_value = json.loads(supplier_frameworks_response.read())
    csv_builder = GenerateMasterCSV(client=mock_data_client, target_framework_slug='test_framework_slug')
    f = cStringIO()
    csv_builder.populate_output()
    csv_builder.write_csv(outfile=f)

    with open(os.path.join(FIXTURES_DIR, 'test_populate_output_suppliers_expected_result.csv')) as expected_file:
        assert f.getvalue() == expected_file.read()
def test_write_csv(fieldname_mock, mock_data_client):
    """Test writing csv."""
    csv_builder = GenerateMasterCSV(client=mock_data_client, target_framework_slug='test_framework_slug')
    assert fieldname_mock.called_once_with('test_framework_slug')
    csv_builder.output = [
        {'test_field_1': 'foo', 'test_field_2': 'bar'},
        {'test_field_1': 'baz', 'test_field_2': u'Ąćĉ'}
    ]
    f = cStringIO()
    csv_builder.write_csv(outfile=f)

    expected_data = "test_field_1,test_field_2\nfoo,bar\nbaz,Ąćĉ\n"

    assert f.getvalue() == expected_data
def test_get_fieldnames(mock_data_client):
    """Test building filenames."""
    csv_builder = GenerateMasterCSV(client=mock_data_client, target_framework_slug='test_framework_slug')
    assert mock_data_client.get_framework.called_once_with('test_framework_slug')

    csv_builder.service_status_labels = OrderedDict([('key1', 'test_lot_prefix_1'), ('key2', 'test_lot_prefix_2')])
    csv_builder.static_fieldnames = ('test_static_fieldname_1', 'test_static_fieldname_2')

    expected_data = tuple([
        'test_static_fieldname_1',
        'test_static_fieldname_2',
        'test_lot_prefix_1_test_lot_slug_1',
        'test_lot_prefix_2_test_lot_slug_1',
        'test_lot_prefix_1_test_lot_slug_2',
        'test_lot_prefix_2_test_lot_slug_2'
    ])
    assert csv_builder.get_fieldnames() == expected_data
Example #4
0
def test_write_csv(fieldname_mock, mock_data_client):
    """Test writing csv."""
    csv_builder = GenerateMasterCSV(
        client=mock_data_client, target_framework_slug='test_framework_slug')
    assert fieldname_mock.called_once_with('test_framework_slug')
    csv_builder.output = [{
        'test_field_1': 'foo',
        'test_field_2': 'bar'
    }, {
        'test_field_1': 'baz',
        'test_field_2': u'Ąćĉ'
    }]
    f = cStringIO()
    csv_builder.write_csv(outfile=f)

    expected_data = "test_field_1,test_field_2\nfoo,bar\nbaz,Ąćĉ\n"

    assert f.getvalue() == expected_data
Example #5
0
def test_get_fieldnames(mock_data_client):
    """Test building filenames."""
    csv_builder = GenerateMasterCSV(
        client=mock_data_client, target_framework_slug='test_framework_slug')
    assert mock_data_client.get_framework.called_once_with(
        'test_framework_slug')

    csv_builder.service_status_labels = OrderedDict([
        ('key1', 'test_lot_prefix_1'), ('key2', 'test_lot_prefix_2')
    ])
    csv_builder.static_fieldnames = ('test_static_fieldname_1',
                                     'test_static_fieldname_2')

    expected_data = tuple([
        'test_static_fieldname_1', 'test_static_fieldname_2',
        'test_lot_prefix_1_test_lot_slug_1',
        'test_lot_prefix_2_test_lot_slug_1',
        'test_lot_prefix_1_test_lot_slug_2',
        'test_lot_prefix_2_test_lot_slug_2'
    ])
    assert csv_builder.get_fieldnames() == expected_data
def test_one_supplier_one_lot(mock_data_client):
    """Test a single client in a single lot."""
    mock_data_client.get_framework.return_value = {
        'frameworks': {'lots': [{'slug': 'saas'}]}
    }
    mock_data_client.find_framework_suppliers.return_value = {
        'supplierFrameworks': [
            {'supplierId': 123, 'supplierName': 'Bens cool supplier', 'extraneous_field': 'foo', 'declaration': ''}
        ]
    }
    mock_data_client.find_draft_services_iter.return_value = iter([{
        'lot': 'saas', 'lotSlug': 'saas', 'status': 'submitted', 'extraneous_field': 'foo'
    }])

    csv_builder = GenerateMasterCSV(client=mock_data_client, target_framework_slug='test_framework_slug')
    f = cStringIO()
    csv_builder.populate_output()
    csv_builder.write_csv(outfile=f)

    with open(os.path.join(FIXTURES_DIR, 'test_one_supplier_one_lot_result.csv')) as expected_file:
        assert f.getvalue() == expected_file.read()
Example #7
0
def test_populate_output_suppliers(mock_data_client):
    """Test supplier info, no lot info."""
    with open(
            os.path.join(FIXTURES_DIR, 'test_supplier_frameworks_response.json'
                         )) as supplier_frameworks_response:
        mock_data_client.find_framework_suppliers.return_value = json.loads(
            supplier_frameworks_response.read())
    csv_builder = GenerateMasterCSV(
        client=mock_data_client, target_framework_slug='test_framework_slug')
    f = cStringIO()
    csv_builder.populate_output()
    csv_builder.write_csv(outfile=f)

    with open(
            os.path.join(FIXTURES_DIR,
                         'test_populate_output_suppliers_expected_result.csv')
    ) as expected_file:
        assert f.getvalue() == expected_file.read()
Example #8
0
def test_one_supplier_one_lot(mock_data_client):
    """Test a single client in a single lot."""
    mock_data_client.get_framework.return_value = {
        'frameworks': {
            'lots': [{
                'slug': 'saas'
            }]
        }
    }
    mock_data_client.find_framework_suppliers.return_value = {
        'supplierFrameworks': [{
            'supplierId': 123,
            'supplierName': 'Bens cool supplier',
            'extraneous_field': 'foo',
            'declaration': ''
        }]
    }
    mock_data_client.find_draft_services_iter.return_value = iter([{
        'lot':
        'saas',
        'lotSlug':
        'saas',
        'status':
        'submitted',
        'extraneous_field':
        'foo'
    }])

    csv_builder = GenerateMasterCSV(
        client=mock_data_client, target_framework_slug='test_framework_slug')
    f = cStringIO()
    csv_builder.populate_output()
    csv_builder.write_csv(outfile=f)

    with open(
            os.path.join(
                FIXTURES_DIR,
                'test_one_supplier_one_lot_result.csv')) as expected_file:
        assert f.getvalue() == expected_file.read()
Usage:
    scripts/oneoff/generate-g-cloud-8-master-csv.py <stage> <auth_token>

Example:
    scripts/oneoff/generate-g-cloud-8-master-csv.py preview myToken
"""
from docopt import docopt

from dmapiclient import DataAPIClient

# add cwd to pythonpath
import sys
sys.path.insert(0, '.')

from dmscripts.generate_framework_master_csv import GenerateMasterCSV
from dmscripts.env import get_api_endpoint_from_stage

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

    client = DataAPIClient(
        base_url=get_api_endpoint_from_stage(arguments['<stage>']),
        auth_token=arguments['<auth_token>'],
    )
    csv_builder = GenerateMasterCSV(
        client=client,
        target_framework_slug='g-cloud-8'
    )
    csv_builder.populate_output()
    csv_builder.write_csv()
Example #10
0
def test_many_suppliers_many_lots(mock_data_client):
    """Full test for creating the csv using realistic data."""
    lot_dicts = [
        {
            'slug': 'saas',
            'lotSlug': 'saas',
            'extraneous_field': 'foo'
        },
        {
            'slug': 'test_lot',
            'lotSlug': 'test_lot',
            'extraneous_field': 'foo'
        },
        {
            'slug': 'test_lot2',
            'lotSlug': 'test_lot2',
            'extraneous_field': 'foo'
        },
    ]
    mock_data_client.get_framework.return_value = {
        'frameworks': {
            'lots': lot_dicts,
            'extraneous_field': 'foo'
        },
        'extraneous_field': 'foo'
    }
    mock_data_client.find_framework_suppliers.return_value = {
        'extraneous_field':
        'foo',
        'supplierFrameworks': [{
            'supplierId': 123,
            'supplierName': 'Bens cool supplier1',
            'extraneous_field': 'foo',
            'declaration': {
                'status': 'complete'
            }
        }, {
            'supplierId': 456,
            'supplierName': 'Bens cool supplier2',
            'extraneous_field': 'foo',
            'declaration': {
                'status': 'complete'
            }
        }, {
            'supplierId': 789,
            'supplierName': 'Bens cool supplier3',
            'extraneous_field': 'foo',
            'declaration': {
                'status': 'complete'
            }
        }, {
            'supplierId': 101,
            'supplierName': 'Bens cool supplier3',
            'extraneous_field': 'foo',
            'declaration': ''
        }]
    }

    # Side effect function for services so we can more accurately mimic prod.
    def service_api_side_effect(supplier_id, **kwargs):
        if supplier_id == 123:
            # Imitates a user only in one lot.
            return iter([
                {
                    'lot': 'saas',
                    'lotSlug': 'saas',
                    'status': 'submitted',
                    'extraneous_field': 'foo'
                },
                {
                    'lot': 'saas',
                    'lotSlug': 'saas',
                    'status': 'submitted',
                    'extraneous_field': 'foo'
                },
                {
                    'lot': 'saas',
                    'lotSlug': 'saas',
                    'status': 'submitted',
                    'extraneous_field': 'foo'
                },
                {
                    'lot': 'saas',
                    'lotSlug': 'saas',
                    'status': 'submitted',
                    'extraneous_field': 'foo'
                },
                {
                    'lot': 'saas',
                    'lotSlug': 'saas',
                    'status': 'submitted',
                    'extraneous_field': 'foo'
                },
                {
                    'lot': 'saas',
                    'lotSlug': 'saas',
                    'status': 'submitted',
                    'extraneous_field': 'foo'
                },
            ])
        if supplier_id == 456:
            # Immitates a heavyweight user.
            return iter([
                {
                    'lot': 'saas',
                    'lotSlug': 'saas',
                    'status': 'submitted',
                    'extraneous_field': 'foo'
                },
                {
                    'lot': 'test_lot',
                    'lotSlug': 'test_lot',
                    'status': 'not-submitted',
                    'extraneous_field': 'foo'
                },
                {
                    'lot': 'test_lot',
                    'lotSlug': 'test_lot',
                    'status': 'submitted',
                    'extraneous_field': 'foo'
                },
                {
                    'lot': 'test_lot',
                    'lotSlug': 'test_lot',
                    'status': 'submitted',
                    'extraneous_field': 'foo'
                },
                {
                    'lot': 'test_lot2',
                    'lotSlug': 'test_lot2',
                    'status': 'submitted',
                    'extraneous_field': 'foo'
                },
                {
                    'lot': 'test_lot2',
                    'lotSlug': 'test_lot2',
                    'status': 'submitted',
                    'extraneous_field': 'foo'
                },
            ])
        if supplier_id == 789:
            # Imitates a supplier with no submitted service but a started application.
            return iter([{
                'lot': 'test_lot2',
                'lotSlug': 'test_lot2',
                'status': 'not-submitted',
                'extraneous_field': 'foo'
            }])
        if supplier_id == 101:
            # Imitates a supplier registered but with no services.
            return iter([])
        else:
            # We should not get here.
            assert False, "The csv creator recieved an invalid supplier id."

    mock_data_client.find_draft_services_iter.side_effect = service_api_side_effect

    csv_builder = GenerateMasterCSV(
        client=mock_data_client, target_framework_slug='test_framework_slug')
    f = cStringIO()
    csv_builder.populate_output()
    csv_builder.write_csv(outfile=f)

    with open(
            os.path.join(
                FIXTURES_DIR,
                'test_many_suppliers_many_lots_result.csv')) as expected_file:
        assert f.getvalue() == expected_file.read()
def test_many_suppliers_many_lots(mock_data_client):
    """Full test for creating the csv using realistic data."""
    lot_dicts = [
        {'slug': 'saas', 'lotSlug': 'saas', 'extraneous_field': 'foo'},
        {'slug': 'test_lot', 'lotSlug': 'test_lot', 'extraneous_field': 'foo'},
        {'slug': 'test_lot2', 'lotSlug': 'test_lot2', 'extraneous_field': 'foo'},
    ]
    mock_data_client.get_framework.return_value = {
        'frameworks': {'lots': lot_dicts, 'extraneous_field': 'foo'}, 'extraneous_field': 'foo'
    }
    mock_data_client.find_framework_suppliers.return_value = {
        'extraneous_field': 'foo',
        'supplierFrameworks': [
            {
                'supplierId': 123,
                'supplierName': 'Bens cool supplier1',
                'extraneous_field': 'foo',
                'declaration': {'status': 'complete'}
            },
            {
                'supplierId': 456,
                'supplierName': 'Bens cool supplier2',
                'extraneous_field': 'foo',
                'declaration': {'status': 'complete'}
            },
            {
                'supplierId': 789,
                'supplierName': 'Bens cool supplier3',
                'extraneous_field': 'foo',
                'declaration': {'status': 'complete'}
            },
            {'supplierId': 101, 'supplierName': 'Bens cool supplier3', 'extraneous_field': 'foo', 'declaration': ''}
        ]
    }

    # Side effect function for services so we can more accurately mimic prod.
    def service_api_side_effect(supplier_id, **kwargs):
        if supplier_id == 123:
            # Imitates a user only in one lot.
            return iter([
                {'lot': 'saas', 'lotSlug': 'saas', 'status': 'submitted', 'extraneous_field': 'foo'},
                {'lot': 'saas', 'lotSlug': 'saas', 'status': 'submitted', 'extraneous_field': 'foo'},
                {'lot': 'saas', 'lotSlug': 'saas', 'status': 'submitted', 'extraneous_field': 'foo'},
                {'lot': 'saas', 'lotSlug': 'saas', 'status': 'submitted', 'extraneous_field': 'foo'},
                {'lot': 'saas', 'lotSlug': 'saas', 'status': 'submitted', 'extraneous_field': 'foo'},
                {'lot': 'saas', 'lotSlug': 'saas', 'status': 'submitted', 'extraneous_field': 'foo'},
            ])
        if supplier_id == 456:
            # Immitates a heavyweight user.
            return iter([
                {'lot': 'saas', 'lotSlug': 'saas', 'status': 'submitted', 'extraneous_field': 'foo'},
                {'lot': 'test_lot', 'lotSlug': 'test_lot', 'status': 'not-submitted', 'extraneous_field': 'foo'},
                {'lot': 'test_lot', 'lotSlug': 'test_lot', 'status': 'submitted', 'extraneous_field': 'foo'},
                {'lot': 'test_lot', 'lotSlug': 'test_lot', 'status': 'submitted', 'extraneous_field': 'foo'},
                {'lot': 'test_lot2', 'lotSlug': 'test_lot2', 'status': 'submitted', 'extraneous_field': 'foo'},
                {'lot': 'test_lot2', 'lotSlug': 'test_lot2', 'status': 'submitted', 'extraneous_field': 'foo'},
            ])
        if supplier_id == 789:
            # Imitates a supplier with no submitted service but a started application.
            return iter([{
                'lot': 'test_lot2', 'lotSlug': 'test_lot2', 'status': 'not-submitted', 'extraneous_field': 'foo'
            }])
        if supplier_id == 101:
            # Imitates a supplier registered but with no services.
            return iter([])
        else:
            # We should not get here.
            assert False, "The csv creator recieved an invalid supplier id."
    mock_data_client.find_draft_services_iter.side_effect = service_api_side_effect

    csv_builder = GenerateMasterCSV(client=mock_data_client, target_framework_slug='test_framework_slug')
    f = cStringIO()
    csv_builder.populate_output()
    csv_builder.write_csv(outfile=f)

    with open(os.path.join(FIXTURES_DIR, 'test_many_suppliers_many_lots_result.csv')) as expected_file:
        assert f.getvalue() == expected_file.read()
Example #12
0
* Application / no_application
* The status of their declaration
* The number of services submitted and left in draft per lot

Usage:
    scripts/generate-framework-master-csv.py <framework_slug> <stage> <auth_token>

Example:
    scripts/generate-framework-master-csv.py g-cloud-8 preview myToken | tee g-cloud-8-master.csv
"""
import sys

from dmapiclient import DataAPIClient
from docopt import docopt
sys.path.insert(0, '.')

from dmscripts.generate_framework_master_csv import GenerateMasterCSV
from dmutils.env_helpers import get_api_endpoint_from_stage

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

    client = DataAPIClient(
        base_url=get_api_endpoint_from_stage(arguments['<stage>']),
        auth_token=arguments['<auth_token>'],
    )
    csv_builder = GenerateMasterCSV(
        client=client, target_framework_slug=arguments['<framework_slug>'])
    csv_builder.populate_output()
    csv_builder.write_csv()