#!/usr/bin/env python3
# Copyright 2023 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import pathlib
import shutil
import sys
import tempfile
import unittest
import zipfile

import zip_helpers


def _make_test_zips(tmp_dir, create_conflct=False):
    zip1 = os.path.join(tmp_dir, 'A.zip')
    zip2 = os.path.join(tmp_dir, 'B.zip')
    with zipfile.ZipFile(zip1, 'w') as z:
        z.writestr('file1', 'AAAAA')
        z.writestr('file2', 'BBBBB')
    with zipfile.ZipFile(zip2, 'w') as z:
        z.writestr('file2', 'ABABA' if create_conflct else 'BBBBB')
        z.writestr('file3', 'CCCCC')
    return zip1, zip2


class ZipHelpersTest(unittest.TestCase):
    def test_merge_zips__identical_file(self):
        with tempfile.TemporaryDirectory() as tmp_dir:
            zip1, zip2 = _make_test_zips(tmp_dir)

            merged_zip = os.path.join(tmp_dir, 'merged.zip')
            zip_helpers.merge_zips(merged_zip, [zip1, zip2])

            with zipfile.ZipFile(merged_zip) as z:
                self.assertEqual(z.namelist(), ['file1', 'file2', 'file3'])

    def test_merge_zips__conflict(self):
        with tempfile.TemporaryDirectory() as tmp_dir:
            zip1, zip2 = _make_test_zips(tmp_dir, create_conflct=True)

            merged_zip = os.path.join(tmp_dir, 'merged.zip')
            with self.assertRaises(Exception):
                zip_helpers.merge_zips(merged_zip, [zip1, zip2])

    def test_merge_zips__conflict_with_append(self):
        with tempfile.TemporaryDirectory() as tmp_dir:
            zip1, zip2 = _make_test_zips(tmp_dir, create_conflct=True)

            with self.assertRaises(Exception):
                with zipfile.ZipFile(zip1, 'a') as dst_zip:
                    zip_helpers.merge_zips(dst_zip, [zip2])


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