import pytest

from mock import patch

from data.database import model
from data.users.shared import can_create_user

from test.fixtures import *

@pytest.mark.parametrize('open_creation, invite_only, email, has_invite, can_create', [
  # Open user creation => always allowed.
  (True, False, None, False, True),

  # Open user creation => always allowed.
  (True, False, 'foo@example.com', False, True),

  # Invite only user creation + no invite => disallowed.
  (True, True, None, False, False),

  # Invite only user creation + no invite => disallowed.
  (True, True, 'foo@example.com', False, False),

  # Invite only user creation + invite => allowed.
  (True, True, 'foo@example.com', True, True),

  # No open creation => Disallowed.
  (False, True, 'foo@example.com', False, False),
  (False, True, 'foo@example.com', True, False),
])
def test_can_create_user(open_creation, invite_only, email, has_invite, can_create, app):
  if has_invite:
    inviter = model.user.get_user('devtable')
    team = model.team.get_organization_team('buynlarge', 'owners')
    model.team.add_or_invite_to_team(inviter, team, email=email)

  with patch('features.USER_CREATION', open_creation):
    with patch('features.INVITE_ONLY_USER_CREATION', invite_only):
      assert can_create_user(email) == can_create