#!/usr/bin/env python

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.

import mozfile
import os
import shutil
import tempfile
import unittest
from mozprofile.permissions import Permissions
try:
    import sqlite3
except ImportError:
    from pysqlite2 import dbapi2 as sqlite3


class PermissionsTest(unittest.TestCase):

    locations = """http://mochi.test:8888  primary,privileged
http://127.0.0.1:80             noxul
http://127.0.0.1:8888           privileged
"""

    def setUp(self):
        self.profile_dir = tempfile.mkdtemp()
        self.locations_file = mozfile.NamedTemporaryFile()
        self.locations_file.write(self.locations)
        self.locations_file.flush()

    def tearDown(self):
        if self.profile_dir:
            shutil.rmtree(self.profile_dir)
        if self.locations_file:
            self.locations_file.close()

    def test_schema_version(self):
        perms = Permissions(self.profile_dir, self.locations_file.name)
        perms_db_filename = os.path.join(self.profile_dir, 'permissions.sqlite')
        perms.write_db(self.locations_file)

        stmt = 'PRAGMA user_version;'

        con = sqlite3.connect(perms_db_filename)
        cur = con.cursor()
        cur.execute(stmt)
        entries = cur.fetchall()

        schema_version = entries[0][0]
        self.assertEqual(schema_version, 2)

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