import hashlib

import pytest

from app import storage
from data import model, database
from storage.basestorage import StoragePaths
from workers.storagereplication import StorageReplicationWorker

from test.fixtures import *


@pytest.fixture()
def storage_user(app):
  user = model.user.get_user('devtable')
  database.UserRegion.create(user=user,
                             location=database.ImageStorageLocation.get(name='local_us'))
  database.UserRegion.create(user=user,
                             location=database.ImageStorageLocation.get(name='local_eu'))
  return user


@pytest.fixture()
def storage_paths():
  return StoragePaths()


@pytest.fixture()
def replication_worker():
  return StorageReplicationWorker(None)


def test_storage_replication_v1(storage_user, storage_paths, replication_worker, app):
  # Add a storage entry with a V1 path.
  v1_storage = model.storage.create_v1_storage('local_us')
  content_path = storage_paths.v1_image_layer_path(v1_storage.uuid)
  storage.put_content(['local_us'], content_path, 'some content')

  # Call replicate on it and verify it replicates.
  result = replication_worker.replicate_storage(storage_user, v1_storage.uuid)
  assert result

  # Ensure that the data was replicated to the other "region".
  assert storage.get_content(['local_eu'], content_path) == 'some content'

  locations = model.storage.get_storage_locations(v1_storage.uuid)
  assert len(locations) == 2


def test_storage_replication_cas(storage_user, storage_paths, replication_worker, app):
  # Add a storage entry with a CAS path.
  content_checksum = 'sha256:' + hashlib.sha256('some content').hexdigest()
  cas_storage = database.ImageStorage.create(cas_path=True, content_checksum=content_checksum)

  location = database.ImageStorageLocation.get(name='local_us')
  database.ImageStoragePlacement.create(storage=cas_storage, location=location)

  content_path = storage_paths.blob_path(cas_storage.content_checksum)
  storage.put_content(['local_us'], content_path, 'some content')

  # Call replicate on it and verify it replicates.
  result = replication_worker.replicate_storage(storage_user, cas_storage.uuid)
  assert result

  # Ensure that the data was replicated to the other "region".
  assert storage.get_content(['local_eu'], content_path) == 'some content'

  locations = model.storage.get_storage_locations(cas_storage.uuid)
  assert len(locations) == 2