describe('Raygun Exception Handler when on development URL', () => {
  var subject: RaygunExceptionHandler;
  var http: TypeMoq.Mock<Http> = TypeMoq.Mock.ofType(Http);
  var sampleResponse = TypeMoq.Mock.ofType(Observable);
  var sampleException: TypeMoq.Mock<WrappedException> = TypeMoq.Mock.ofType(WrappedException);
  var originalException = new Error('fintech');

  http
    .setup(x => x.post(TypeMoq.It.isAny(), TypeMoq.It.isAny()))
    .returns(() => sampleResponse.object);

  sampleException
    .setup(x => x.originalException)
    .returns(() => originalException);

  beforeEach(() => {
    RaygunExceptionHandler.apiKey = 'fintechfintech==';
    RaygunExceptionHandler.version = '1.0.0';
    RaygunExceptionHandler.setDevelopmentHostnames([global['window'].location.origin]);

    subject = new RaygunExceptionHandler(http.object);
  });

  it('should exist', () => {
    assert.ok(RaygunExceptionHandler);
  });

  it('should not attempt to call the Raygun API but does rethrow the exception', () => {
    assert.throws(() => subject.call(sampleException.object), Error, originalException.message);
    
    http.verify(x => x.post(TypeMoq.It.isAny(), TypeMoq.It.isAny()), TypeMoq.Times.never());
  });
});
describe('Raygun Exception Handler', () => {
  var subject: RaygunExceptionHandler;
  var http: TypeMoq.Mock<Http> = TypeMoq.Mock.ofType(Http);
  var sampleResponse = TypeMoq.Mock.ofType(Observable);
  var sampleException: TypeMoq.Mock<WrappedException> = TypeMoq.Mock.ofType(WrappedException);
  var originalException = new Error('fintech');

  http
    .setup(x => x.post(TypeMoq.It.isAny(), TypeMoq.It.isAny()))
    .returns(() => sampleResponse.object);

  sampleException
    .setup(x => x.originalException)
    .returns(() => originalException);

  beforeEach(() => {
    RaygunExceptionHandler.apiKey = 'fintechfintech==';
    RaygunExceptionHandler.version = '1.0.0';

    subject = new RaygunExceptionHandler(http.object);
  });

  it('should exist', () => {
    assert.ok(RaygunExceptionHandler);
  });

  it('should attempt to call the Raygun API and rethrow the exception', () => {
    assert.throws(() => subject.call(sampleException.object), Error, originalException.message);
    
    http.verify(x => x.post('https://api.raygun.io/entries?apikey=fintechfintech==', TypeMoq.It.isAny()), TypeMoq.Times.once());
  });
});
describe('Error Report', () => {
  var subject: ErrorReport;
  var sampleException = TM.Mock.ofType(WrappedException);
  var clock: Sinon.SinonFakeTimers;
  
  sampleException.setup(x => x.originalException)
    .returns(() => new Error('fintech'));
  
  beforeEach(() => {
    clock = sinon.useFakeTimers();
    subject = new ErrorReport(sampleException.object);
  });
  
  afterEach(() => {
    clock.restore();
  });
  
  it('should set the time of occurence', () => {
    assert.equal(subject.occurredOn, new Date().toISOString());
  });
  
  it('should create an error details object', () => {
    assert.ok(subject.details);
  });
});
describe('Raygun Error', () => {
  var subject: RaygunError;
  var sampleException = TM.Mock.ofType(WrappedException);
  
  sampleException.setup(x => x.originalException)
    .returns(() => new Error('fintech'));
    
  beforeEach(() => {
    subject = new RaygunError(sampleException.object);
  });
  
  it('should set the error type', () => {
    assert.equal(subject.className, 'Error');
  });
  
  it('should contain the error message', () => {
    assert.equal(subject.message, 'fintech');
  });
  
  it('should create a stack trace', () => {
    assert.isArray(subject.stackTrace);
    assert.ok(subject.stackTrace[0].fileName);
    assert.ok(subject.stackTrace[0].lineNumber);
    assert.ok(subject.stackTrace[0].columnNumber);
    assert.ok(subject.stackTrace[0].methodName);
    assert.ok(subject.stackTrace[0].className);
  });
});
describe('Error Details', () => {
  var subject: ErrorDetails;
  var sampleError = TM.Mock.ofType(WrappedException);
  
  sampleError.setup(x => x.originalException)
    .returns(() => new Error('fintech'));
   
  beforeEach(() => {
    subject = new ErrorDetails(sampleError.object);
  });
  
  it('should generate a grouping key by base64 encoding the error message', () => {
    assert.equal(subject.generateGroupingKey(sampleError.object.originalException.message), 'ZmludGVjaA==');
  });
  
  it('should generate child objects', () => {
    assert.ok(subject.groupingKey);
    assert.ok(subject.error);
    assert.ok(subject.environment);
    assert.ok(subject.request);
    assert.ok(subject.client);
  });
});