Boy, this has been a "learning experience", I hope for you, but also for me, as I've made a few careless mistakes, and failed to spot the "obvious answers" until you "rubbed my nose in it".
So, admission, my code produces exactly the same results as yours, I just was "fooled" by the plot and therefore didn't come up with the "obvious answer" (as I had by pointing out that a value of 0, in dB, would be "-inf" if logarithms of 0 were allowed).
When you run your (or my) code, you see much of the plot sitting at -400 dB (which corresponds to a value around 10^(-40), a very small number). If you do not use the dB scale, it appears that the spectrum is 0 "almost everywhere" except at the frequencies in the signal (which, after all, is the "right" answer). Your "very reasonable question" is why, when you take dB, it isn't -inf "almost everywhere".
So here the final lesson, and the final part of the "solution" to your question (please, mark the Solutions so that other Community members interested in PSD computations "know" there are "answers" here). You are doing computations using floating point numbers, which are of finite precision. The computations involve computing sines and cosines, also involving finite precision, and arithmetic (addition, subtraction, multiplication, and division, or, as some have said, ambition, distraction, uglification, and derision). Although the correct answers should be 0, there will be round-off errors that might result in numbers very close to, but not exactly 0. That is what is happening here -- you can verify this for yourself by sending the values you are plotting to an ordinary indicator and looking at the array -- when I did this, every other number was 0, and in between were numbers with between 37 and 40 zeros after the decimal point (i.e. on the order of 10^(-40).
So here is a final piece of advice. Add a "Filter" to the output of the PSD to keep the range from going "off the deep end" to -inf. The attached Snippet shows one easy method -- take the points and "coerce" them to a reasonable data range. Since you expect the value to correspond to an amplitude of 0.05, depending on exactly what is being plotted, you expect a number on the order of 0.05 in dB, or around -20 dB. The nice thing is that now AutoScale Y works for you, and will let you see the peaks clearly.
Bob Schor