Testing Angular 1.x controller's use of service with $httpBackend and Jasmine 2.x

Created for discussion http://www.coderanch.com/t/662688/HTML-CSS-JavaScript/function-Unit-testing-angularjs

by Peer Reynders

HTML

<link rel="stylesheet" href="https://jasmine.github.io/2.4/lib/jasmine.css">
<script src="https://jasmine.github.io/2.4/lib/jasmine.js"></script>
<script src="https://jasmine.github.io/2.4/lib/jasmine-html.js"></script>
<script src="https://jasmine.github.io/2.4/lib/boot.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular-mocks.js"></script>

JavaScript

//--- CODE ---
(function(angular){
  /*
    Contrived login service hitting a login page:
    Success:
    1. POST /login with application/x-www-form-urlencoded {name,password}
    2. 302 Redirect to /index.html
    3. 200 OK from /index.html
    Failure:
    2a. 401 Unauthorized
  */
  loginServiceFactory1.$inject = ['$http','$httpParamSerializerJQLike'];
  function loginServiceFactory1 ($http, $httpParamSerializerJQLike) {
    // login function for login service instance
    function login (name, password) {
      var config;
      // login function's "login successful" handler
      function loginOk (response) {
        var etag = response.headers('etag'),
            data = response.data;
        // Do something with the response ...

        return {
            loggedIn: true,
            status: response.status
        };
      }
      // login function's "login failed" handler
      function loginFail (response) {
        return {
            loggedIn: false,
            status: response.status
        };
      }

      // login body
      config = {
        url: '/login',
        method: 'POST',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
        },
        data: $httpParamSerializerJQLike({
          name: name,
          password: password
        })
      };
      // 2xx -> loginOK; loginFail otherwise
      return $http(config).then(loginOk, loginFail);
    } // end login
    
    return { login: login }; // return the loginService instance 
  } // end loginServiceFactory1 

  // Controller using the login service
  DemoController.$inject = ['loginService'];
  function DemoController(loginService) {
    var vm; 
    // controller instance "login attempt complete" handler
    function successCb(result){
      if (result.loggedIn) {
        vm.result = vm.name + 
          ' successfully logged in (' + result.status + ')';
          
      } else {
        vm.result = 'Login failed (' + result.status...