Search code examples
ember.jsember-qunit

Ember auth transition.retry() after login doesn't transit while testing


I am having some issues with testing my login and related features of my app. The app works perfectly, but the test fails. For testing, I use a Qunit with karma

I have created few authenticated routes(say accounts) which one can only visit after logging in. If a user goes to accounts route without logging, he is redirected to login page and after successful login, redirected back to the accounts page.

App.AuthenticatedRoute = Ember.Route.extend({
  beforeModel: function(transition) {
    if (!App.AuthManager.isAuthenticated()) {
      this.redirectToLogin(transition);
    }
  },
  redirectToLogin: function(transition) {
    var loginController;
    loginController = this.controllerFor('login');
    loginController.set("attemptedTransition", transition);
    this.transitionTo("login");
  },
  events: {
    error: function(reason, transition) {
      this.redirectToLogin(transition);
    }
  }
});


App.LoginController = Ember.ObjectController.extend({
  attemptedTransition: null,
  loginUser: function() {
    var attemptedTran, form_data, router, that;
    router = this.get("target");
    form_data = this.getProperties("email", "password");
    attemptedTran = this.get('attemptedTransition');
    that = this;
    return $.post("/sessions", {
      'session': form_data
    }, (function(results) {
      return Ember.run(function() {
        App.AuthManager.authenticate(results.api_key.access_token, results.api_key.user_id);
        if (attemptedTran) {
          attemptedTran.retry();
          return that.set('attemptedTransition', null);
        } else {
          return router.transitionTo("index");
        }
      });
    }), "json");
  }
});

App.AccountsRoute = App.AuthenticatedRoute.extend({
  model: function() {
    return this.store.find('account');
  }
});

I am trying to test this using

test("account index", function() {
    expect(3); // Ensure that we will perform one assertion

  visit("/accounts").andThen(function() {
    equal(currentRouteName(),"login",'Accounts is an authenticated Route. so redirected to login page');
    fillIn('input[type=text]', "j@j.com");
    fillIn('input[type=password]', "jjjjjj");
    click("button:submit").andThen(function(){
      equal(currentRouteName(),"accounts",'After login redirected back to account page.');
    })
 });

But this test fails after logging in and doesn't redirect back to the accounts page. Any help??


Solution

  • It looks like you're setting previousTransition then getting attemptedTransition. attemptedTransition should always be null according to the logic above.