import {OrganizationFixture} from 'sentry-fixture/organization';

import OrganizationStore from 'sentry/stores/organizationStore';
import RequestError from 'sentry/utils/requestError/requestError';

describe('OrganizationStore', function () {
  beforeEach(function () {
    OrganizationStore.reset();
  });

  it('starts with loading state', function () {
    expect(OrganizationStore.get()).toMatchObject({
      loading: true,
      error: null,
      errorType: null,
      organization: null,
      dirty: false,
    });
  });

  it('updates correctly', function () {
    const organization = OrganizationFixture();
    OrganizationStore.onUpdate(organization);
    expect(OrganizationStore.get()).toMatchObject({
      loading: false,
      error: null,
      errorType: null,
      organization,
      dirty: false,
    });

    // updates
    organization.slug = 'a new slug';
    OrganizationStore.onUpdate(organization);
    expect(OrganizationStore.get()).toMatchObject({
      loading: false,
      error: null,
      errorType: null,
      organization,
      dirty: false,
    });
  });

  it('updates correctly from setting changes', function () {
    const organization = OrganizationFixture();
    OrganizationStore.onUpdate(organization);
    expect(OrganizationStore.get()).toMatchObject({
      loading: false,
      error: null,
      errorType: null,
      organization,
      dirty: false,
    });
  });

  it('errors correctly', function () {
    const error = new RequestError('GET', '/some/path', new Error('uh oh'));
    error.status = 404;
    OrganizationStore.onFetchOrgError(error);
    expect(OrganizationStore.get()).toMatchObject({
      loading: false,
      error,
      errorType: 'ORG_NOT_FOUND',
      organization: null,
      dirty: false,
    });
  });

  it('returns a stable reference from getState', function () {
    const organization = OrganizationFixture();
    OrganizationStore.onUpdate(organization);
    const state = OrganizationStore.getState();
    expect(Object.is(state, OrganizationStore.getState())).toBe(true);
  });
});