def test_get_election0_xlsx(self):
        response = self.client.get(
            reverse('results-export'),
            { 'election': str(Election.objects.get(name='Election 0').id) }
        )

        self.assertEqual(response.status_code, 200)        

        self.assertEqual(
            response['Content-Disposition'],
            'attachment; filename="Election 0 Results.xlsx"'
        )

        wb = openpyxl.load_workbook(io.BytesIO(response.content))

        self.assertEqual(len(wb.worksheets), 1)

        # Check first worksheet.
        ws = wb.worksheets[0]

        self.assertEqual(wb.sheetnames[0], 'Election 0')

        row_count = ws.max_row
        col_count = ws.max_column
        self.assertEqual(row_count, 25)
        self.assertEqual(col_count, 5)

        self.assertEqual(str(ws.cell(1, 1).value), 'Election 0 Results')

        self.assertEqual(str(ws.cell(2, 1).value), 'Candidates')

        cellContents = [
            'Position 0',
            'Party 0',
            '0, 0',
            'Party 1',
            '3, 3',
            'Party 2',
            'None',
            'Position 1',
            'Party 0',
            '1, 1',
            'Party 1',
            '4, 4',
            'Party 2',
            'None',
            'Position 2',
            'Party 0',
            '2, 2',
            'Party 1',
            '5, 5',
            'Party 2',
            'None'
        ]
        for cellIndex, content in enumerate(cellContents, 5):
            self.assertEqual(str(ws.cell(cellIndex, 1).value), content) 

        self.assertEqual(str(ws.cell(2, 2).value), 'Number of Votes')

        self.assertEqual(str(ws.cell(3, 2).value), '0')

        self.assertEqual(str(ws.cell(4, 2).value), '0') # Section

        self.assertEqual(str(ws.cell(7, 2).value), '1')
        self.assertEqual(str(ws.cell(9, 2).value), '0')
        self.assertEqual(str(ws.cell(11, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(14, 2).value), '2')
        self.assertEqual(str(ws.cell(16, 2).value), '0')
        self.assertEqual(str(ws.cell(18, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(21, 2).value), '0')
        self.assertEqual(str(ws.cell(23, 2).value), '0')
        self.assertEqual(str(ws.cell(25, 2).value), 'N/A')

        self.assertEqual(str(ws.cell(4, 3).value), '1') # Section

        self.assertEqual(str(ws.cell(7, 3).value), '0')
        self.assertEqual(str(ws.cell(9, 3).value), '1')
        self.assertEqual(str(ws.cell(11, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(14, 3).value), '0')
        self.assertEqual(str(ws.cell(16, 3).value), '0')
        self.assertEqual(str(ws.cell(18, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(21, 3).value), '1')
        self.assertEqual(str(ws.cell(23, 3).value), '0')
        self.assertEqual(str(ws.cell(25, 2).value), 'N/A')

        self.assertEqual(str(ws.cell(3, 4).value), '1')

        self.assertEqual(str(ws.cell(4, 4).value), '2') # Section

        self.assertEqual(str(ws.cell(7, 4).value), '0')
        self.assertEqual(str(ws.cell(9, 4).value), '0')
        self.assertEqual(str(ws.cell(11, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(14, 4).value), '0')
        self.assertEqual(str(ws.cell(16, 4).value), '1')
        self.assertEqual(str(ws.cell(18, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(21, 4).value), '0')
        self.assertEqual(str(ws.cell(23, 4).value), '1')
        self.assertEqual(str(ws.cell(25, 2).value), 'N/A')

        self.assertEqual(str(ws.cell(3, 5).value), 'Total Votes')
        self.assertEqual(str(ws.cell(7, 5).value), '1')
        self.assertEqual(str(ws.cell(9, 5).value), '1')
        self.assertEqual(str(ws.cell(11, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(14, 5).value), '2')
        self.assertEqual(str(ws.cell(16, 5).value), '1')
        self.assertEqual(str(ws.cell(18, 2).value), 'N/A')
        self.assertEqual(str(ws.cell(21, 5).value), '1')
        self.assertEqual(str(ws.cell(23, 5).value), '1')
        self.assertEqual(str(ws.cell(25, 2).value), 'N/A')
def _read_metadata_from_example_file(netcdf_file_name, include_soundings):
    """Reads metadata from file with input examples.

    :param netcdf_file_name: Path to input file.
    :param include_soundings: Boolean flag.  If True and file contains
        soundings, this method will return keys "sounding_field_names" and
        "sounding_heights_m_agl".  Otherwise, will not return said keys.

    :return: example_dict: Dictionary with the following keys (explained in doc
        to `write_example_file`).
    example_dict['full_id_strings']
    example_dict['storm_times_unix_sec']
    example_dict['radar_field_names']
    example_dict['radar_heights_m_agl']
    example_dict['rotated_grids']
    example_dict['rotated_grid_spacing_metres']
    example_dict['target_names']
    example_dict['sounding_field_names']
    example_dict['sounding_heights_m_agl']

    :return: netcdf_dataset: Instance of `netCDF4.Dataset`, which can be used to
        keep reading file.
    """

    netcdf_dataset = netCDF4.Dataset(netcdf_file_name)
    include_soundings = (
        include_soundings and
        SOUNDING_FIELDS_KEY in netcdf_dataset.variables
    )

    example_dict = {
        ROTATED_GRIDS_KEY: bool(getattr(netcdf_dataset, ROTATED_GRIDS_KEY)),
        TARGET_NAMES_KEY: [
            str(s) for s in
            netCDF4.chartostring(netcdf_dataset.variables[TARGET_NAMES_KEY][:])
        ],
        FULL_IDS_KEY: [
            str(s) for s in
            netCDF4.chartostring(netcdf_dataset.variables[FULL_IDS_KEY][:])
        ],
        STORM_TIMES_KEY: numpy.array(
            netcdf_dataset.variables[STORM_TIMES_KEY][:], dtype=int
        ),
        RADAR_FIELDS_KEY: [
            str(s) for s in
            netCDF4.chartostring(netcdf_dataset.variables[RADAR_FIELDS_KEY][:])
        ],
        RADAR_HEIGHTS_KEY: numpy.array(
            netcdf_dataset.variables[RADAR_HEIGHTS_KEY][:], dtype=int
        )
    }

    # TODO(thunderhoser): This is a HACK to deal with bad files.
    example_dict[TARGET_NAMES_KEY] = [
        n for n in example_dict[TARGET_NAMES_KEY] if n != ''
    ]

    if example_dict[ROTATED_GRIDS_KEY]:
        example_dict[ROTATED_GRID_SPACING_KEY] = getattr(
            netcdf_dataset, ROTATED_GRID_SPACING_KEY)
    else:
        example_dict[ROTATED_GRID_SPACING_KEY] = None

    if not include_soundings:
        return example_dict, netcdf_dataset

    example_dict.update({
        SOUNDING_FIELDS_KEY: [
            str(s) for s in netCDF4.chartostring(
                netcdf_dataset.variables[SOUNDING_FIELDS_KEY][:])
        ],
        SOUNDING_HEIGHTS_KEY:
            numpy.array(netcdf_dataset.variables[SOUNDING_HEIGHTS_KEY][:],
                        dtype=int)
    })

    return example_dict, netcdf_dataset