# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import unittest

from dashboard import namespaced_stored_object
from dashboard import stored_object
from dashboard import testing_common


class NamespacedStoredObjectTest(testing_common.TestCase):

  def setUp(self):
    super(NamespacedStoredObjectTest, self).setUp()
    testing_common.SetIsInternalUser('internal@chromium.org', True)
    testing_common.SetIsInternalUser('foo@chromium.org', False)

  def tearDown(self):
    super(NamespacedStoredObjectTest, self).tearDown()
    self.UnsetCurrentUser()

  def testSet_InternalUser_InternalVersionSet(self):
    self.SetCurrentUser('internal@chromium.org')
    namespaced_stored_object.Set('foo', 12345)
    self.assertEqual(12345, stored_object.Get('internal_only__foo'))
    self.assertIsNone(stored_object.Get('externally_visible__foo'))

  def testSet_ExternalUser_ExternalVersionSet(self):
    self.SetCurrentUser('foo@chromium.org')
    namespaced_stored_object.Set('foo', 12345)
    self.assertIsNone(stored_object.Get('internal_only__foo'))
    self.assertEqual(12345, stored_object.Get('externally_visible__foo'))

  def testSetExternal_InternalUser_ExternalVersionSet(self):
    self.SetCurrentUser('internal@chromium.org')
    namespaced_stored_object.SetExternal('foo', 12345)
    self.assertIsNone(stored_object.Get('internal_only__foo'))
    self.assertEqual(12345, stored_object.Get('externally_visible__foo'))

  def testGet_NothingSet_NoneReturned(self):
    self.assertIsNone(namespaced_stored_object.Get('foo'))

  def testGet_InternalUser_InternalVersionReturned(self):
    self.SetCurrentUser('internal@chromium.org')
    stored_object.Set('internal_only__foo', [1, 2, 3])
    stored_object.Set('externally_visible__foo', [4, 5, 6])
    self.assertEqual([1, 2, 3], namespaced_stored_object.Get('foo'))

  def testGet_ExternalUser_ExternalVersionReturned(self):
    self.SetCurrentUser('foo@chromium.org')
    stored_object.Set('internal_only__foo', [1, 2, 3])
    stored_object.Set('externally_visible__foo', [4, 5, 6])
    self.assertEqual([4, 5, 6], namespaced_stored_object.Get('foo'))

  def testGetExternal_InternalUser_ExternalVersionReturned(self):
    self.SetCurrentUser('internal@chromium.org')
    stored_object.Set('internal_only__foo', [1, 2, 3])
    stored_object.Set('externally_visible__foo', [4, 5, 6])
    self.assertEqual([4, 5, 6], namespaced_stored_object.GetExternal('foo'))

  def testDelete_BothVersionsDeleted(self):
    stored_object.Set('internal_only__foo', [1, 2, 3])
    stored_object.Set('externally_visible__foo', [4, 5, 6])
    namespaced_stored_object.Delete('foo')
    self.assertIsNone(stored_object.Get('internal_only__foo'))
    self.assertIsNone(stored_object.Get('externally_visible__foo'))


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