Why only the first test have response? - yii2

I'm trying to write some tests for api but the problem is the response sent from api is ok only for the first request I sent to api, after that, I get
No content was sent from Yii application error.
The problem is I can't use echo directly in my end function (everything is ok if i use echo) because if the response is too long it will be flushed! and now I'm trying to use
Yii::$app->response;
and try to set my response in
$response->content
but in
Yii2::doRequest //the ob_get_clean()
function returns null after first request and throw the No content exception.
Any idea of how I can fix the problem with codeception?

Related

How to pass the wrong value to my request header and assert error message from it

I have to do a unit testing of my servlet by passing the wrong request headers and parameters and getting failure message printed in the console
I have used Mockito framework
I assume your servlet is not third-party but created by you. That means you shouldn't need the mockito for starters ( except of course if you want to mock everything after your servlet ) .
Second. Lets say your servlet accepts APPLICATION-JSON and you send STREAM-OCTET. Shouldn't that return ( response ) the appropriate http error? If you agree with that then asserting the response itself to see if it is the expected http status. ( for example 400 which is bad_request the appropriate response for wrong headers. )
If you want to "hide" the error by returning OK#200 for all the requests you can get a hold of the logger by either injection or reflection ( the first way is preferable ) and parse the output. Printing on the System.out/System.err would be a lot tricker to get a hold of but printing errors there is not a good practice either. But now, if you "hide" the mistake on the headers then your client would never be able to guess what went wrong!

VM892:1 Uncaught SyntaxError: Unexpected token e in JSON at position 0

I'm presently working on a phx / phoenix API written in Elixir. And I have created a frontend for the API using React.js. However, I'm getting the below error message in the JS console of the browser.
I have successfully created a user using Postman, so I'm 99% sure the error isn't with the phx project, but rather somewhere with the React project.
I have both the frontend and backend hosted on github. And a .env file will need to be created in the root of the React project with the below line,
REACT_APP_API_URL=http://localhost:4000/api
and was working my way through the following tutorial.
Any and all help would greatly be appreciated.
The output of localStorage.getItem("token") being
eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJVc2VyOjEiLC‌​JleHAiOjE0ODcyODI4OD‌​csImlhdCI6MTQ4NDY5MD‌​g4NywiaXNzIjoiUGhvZW‌​5peENoYXQiLCJqdGkiOi‌​IwNzFlYzgwYi0wZmYzLT‌​QyYzgtODA3Mi1kNzViZm‌​VhZTg4NWEiLCJwZW0iOn‌​t9LCJzdWIiOiJVc2VyOj‌​EiLCJ0eXAiOiJhY2Nlc3‌​MifQ.NsuqH50HooK8vjF‌​fHtPH9iXSykZ9oYA0ul4‌​b_C5fQtpu_zFvNNy-skc‌​v9HI2i25X-NlB-9xOr-x‌​zh2abnrpYUw
suggests that for some reason, the app stored the token without passing it through JSON.stringify, and calling JSON.parse on this string throws the Unexpected token e error, as expected.
I did not see any localStorage.setItem without JSON.stringify in the current code, so the token was probably stored like that in a previous version of the app. You should try clearing it manually and logging in again.
When we get the non-JSON response, we get such error..
To avoid such error, mention the responseType: Text in your api endpoint call.
This will work,
return this.http.post(`${environment.apiUrl}/login`, user, {responseType: 'text'});
This will not work(If you mention type),
return this.http.post<string>(`${environment.apiUrl}/login`, user, {responseType: 'text'});
This error message usually means you're getting a non-JSON response. If you look at the raw response in the Network tab of your debugger, you should be able to see what you're getting back from the server.

Parse.com cloud httpRequest response.text does not convert to JavaScript object

I have a http request I am trying to make on an afterSave method in my Cloud Code. I have been able to create my request, and when I console.log(response) it outputs a block that contains the information that I am after. I am aware that response.text is a string so I am trying to run JSON.parse(response.text) so I can access my API response.
I can print out what appears to be an object after running JSON.parse, but much of the data within my response is stripped out. I know it is not the fault of the API because I have another function that runs on the client with the same query and it works correctly.
What is the correct way to parse the response.text from a Parse.Cloud.httpRequest to maintain my data.
Try var result = JSON.parse(response['text']).

Detect malformed/invalid JSON in an AngularJS $http.post() call

As can be seen in AngularJS's source, any $http.post request that returns an HTTP code in the 200-299 range will trigger the success() callback even if the response contains invalid data (like for example invalid JSON).
I'm specifically setting my call's responseType: 'json' and even then the success callback is fired when something else comes back. This is especially annoying in the development server where PHP's display_errors setting is turned on. When something goes wrong server-side and PHP outputs an error message the AngularJS app doesn't detect this and continues happily.
Is there a way to prevent this? I mean, to make the AngularJS app fire the error() callback when the response data is invalid JSON?
Thanks
so your PHP server responds with a 200 error code even on an error? Not knowing PHP, this feels like a server configuration problem to me. I'd expect a 500 error with a payload. That being said, there are two things that I can think of offhand.
$http includes transformResponse handlers you can set up to inspect the response for problems.
$http also includes the concept of "interceptors" which allow you to pick up the response payload and do something with it. You could use an interceptor to "reject" the response.
More information on transformResponse and "interceptors" in the $http documentation:
http://docs.angularjs.org/api/ng.$http

Return HTTP error code or 2xx with empty content

I'm a little new to the REST world and I'm not sure on the expected functionality of certain REST APIs.
I have a REST API that takes an ID and some JSON and my function will tack on more values to the JSON and return it
My problem arises when a there is no record for the given ID. Would it be better practice to return an HTTP error code indicating that ID was not found or should I return a 2XX code with empty JSON in the content?