#!/usr/bin/python3

import io
import os
import tempfile
import unittest

import apt_pkg
import testcommon

import aptsources.distro
import aptsources.sourceslist


class TestAptSources(testcommon.TestCase):
    def setUp(self):
        testcommon.TestCase.setUp(self)
        self.tempfile = tempfile.NamedTemporaryFile(suffix=".sources")
        apt_pkg.config.set("Dir::Etc::sourcelist", self.tempfile.name)
        apt_pkg.config.set("Dir::Etc::sourceparts", "/dev/null")

    def tearDown(self):
        self.tempfile.close()

    def testEmptyDeb822(self):
        """aptsources: Test sources.list parsing."""
        sources = aptsources.sourceslist.SourcesList(True)
        self.assertListEqual(sources.list, [])

    def testDeb822SectionRecognizedWithoutEndLine(self):
        """aptsources: Test sources.list parsing."""
        section = aptsources._deb822.Section("key: value\notherkey: othervalue")

        # Writing it back out gives us an extra newline at the end
        self.assertEqual(section["key"], "value")
        self.assertEqual(section["otherkey"], "othervalue")
        self.assertEqual(str(section), "key: value\notherkey: othervalue\n")

        file = aptsources._deb822.File(io.StringIO("key: value\notherkey: othervalue"))
        self.assertEqual(len(file.sections), 1)

        section = next(iter(file))
        self.assertEqual(section["key"], "value")
        self.assertEqual(section["otherkey"], "othervalue")
        self.assertEqual(str(section), "key: value\notherkey: othervalue\n")

    def testDeb822CommentBlockWithoutEndLine(self):
        """aptsources: Test sources.list parsing."""
        section = aptsources._deb822.Section("# a comment\n# another comment")

        self.assertEqual(section.header, " a comment\n another comment\n")
        # Writing it back out gives us an extra newline at the end
        self.assertEqual(str(section), "# a comment\n# another comment\n")

    def testDeb822MultipleLinesSeparator(self):
        """aptsources: Test sources.list parsing."""
        for separator in "\n\n\n\n", "\n\n\n", "\n\n":
            with self.subTest(f"{len(separator)} separators"):
                file = aptsources._deb822.File(
                    io.StringIO("key: value" + separator + "otherkey: othervalue\n")
                )
                self.assertEqual(len(file.sections), 2)

                self.assertEqual(file.sections[0]["key"], "value")
                self.assertEqual(file.sections[1]["otherkey"], "othervalue")
                self.assertEqual(str(file), "key: value\n\notherkey: othervalue\n")


if __name__ == "__main__":
    os.chdir(os.path.dirname(__file__))
    unittest.main()
