{
  "name": "Information Security and Quality Assurance Projects",
  "order": 4,
  "time": "150 hours",
  "helpRoom": "HelpBackend",
  "challenges": [
    {
      "id": "587d8249367417b2b2512c41",
      "title": "Metric-Imperial Converter",
      "description": [
        "Build a full stack JavaScript app that is functionally similar to this: <a href='https://hard-twilight.glitch.me/' target='_blank'>https://hard-twilight.glitch.me/</a>.",
        "Working on this project will involve you writing your code on Glitch on our starter project. After completing this project you can copy your public glitch url (to the homepage of your app) into this screen to test it! Optionally you may choose to write your project on another platform but it must be publicaly visible for our testing.",
        "Start this project on Glitch using <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-metricimpconverter/'>this link</a> or clone <a href='https://github.com/freeCodeCamp/boilerplate-project-metricimpconverter/'>this repository</a> on GitHub! If you use Glitch, remember to save the link to your project somewhere safe!"
      ],
      "challengeSeed": [],
      "tests": [
        {
          "text": "I will prevent the client from trying to guess(sniff) the MIME type.",
          "testString": ""
        },
        {
          "text": "I will prevent cross-site scripting (XSS) attacks.",
          "testString": ""
        },
        {
          "text": "I can GET /api/convert with a single parameter containing an accepted number and unit and have it converted. (Hint: Split the input by looking for the index of the first character which will mark the start of the unit)",
          "testString": ""
        },
        {
          "text": "I can convert 'gal' to 'L' and vice versa. (1 gal to 3.78541 L)",
          "testString": ""
        },
        {
          "text": "I can convert 'lbs' to 'kg' and vice versa. (1 lbs to 0.453592 kg)",
          "testString": ""
        },
        {
          "text": "I can convert 'mi' to 'km' and vice versa. (1 mi to 1.60934 km)",
          "testString": ""
        },
        {
          "text": "If my unit of measurement is invalid, returned will be 'invalid unit'.",
          "testString": ""
        },
        {
          "text": "If my number is invalid, returned with will 'invalid number'.",
          "testString": ""
        },
        {
          "text": "If both are invalid, return will be 'invalid number and unit'.",
          "testString": ""
        },
        {
          "text": "I can use fractions, decimals or both in my parameter(ie. 5, 1/2, 2.5/6), but if nothing is provided it will default to 1.",
          "testString": ""
        },
        {
          "text": "My return will consist of the initNum, initUnit, returnNum, returnUnit, and string spelling out units in format '{initNum} {initial_Units} converts to {returnNum} {return_Units}' with the result rounded to 5 decimals in the string.",
          "testString": ""
        },
        {
          "text": "All 16 unit tests are complete and passing.",
          "testString": ""
        },
        {
          "text": "All 5 functional tests are complete and passing.",
          "testString": ""
        }
      ],
      "solutions": [],
      "hints": [],
      "type": "backend",
      "isRequired": true,
      "releasedOn": "January 15, 2017",
      "translations": {}
    },
    {
      "id": "587d8249367417b2b2512c42",
      "title": "Issue Tracker",
      "description": [
        "Build a full stack JavaScript app that is functionally similar to this: <a href='https://protective-garage.glitch.me/' target='_blank'>https://protective-garage.glitch.me/</a>.",
        "Working on this project will involve you writing your code on Glitch on our starter project. After completing this project you can copy your public glitch url (to the homepage of your app) into this screen to test it! Optionally you may choose to write your project on another platform but it must be publicaly visible for our testing.",
        "Start this project on Glitch using <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-issuetracker/'>this link</a> or clone <a href='https://github.com/freeCodeCamp/boilerplate-project-issuetracker/'>this repository</a> on GitHub! If you use Glitch, remember to save the link to your project somewhere safe!"
      ],
      "challengeSeed": [],
      "tests": [
        {
          "text": "Prevent cross site scripting (XSS) attacks.",
          "testString": ""
        },
        {
          "text": "I can POST /api/issues/{projectname} with form data containing required issue_title, issue_text, created_by, and optional assigned_to and status_text.",
          "testString": ""
        },
        {
          "text": "The object saved (and returned) will include all of those fields (blank for optional no input) and also include created_on(date/time), updated_on(date/time), open(boolean, true for open, false for closed), and _id.",
          "testString": ""
        },
        {
          "text": "I can PUT /api/issues/{projectname} with a id and any fields in the object with a value to object said object. Returned will be 'successfully updated' or 'could not update '+id. This should always update updated_on. If no fields are sent return 'no updated field sent'.",
          "testString": ""
        },
        {
          "text": "I can DELETE /api/issues/{projectname} with a id to completely delete an issue. If no _id is sent return 'id error', success: 'deleted '+id, failed: 'could not delete '+id.",
          "testString": ""
        },
        {
          "text": "I can GET /api/issues/{projectname} for an array of all issues on that specific project with all the information for each issue as was returned when posted.",
          "testString": ""
        },
        {
          "text": "I can filter my get request by also passing along any field and value in the query(ie. /api/issues/{project}?open=false). I can pass along as many fields/values as I want.",
          "testString": ""
        },
        {
          "text": "All 11 functional tests are complete and passing.",
          "testString": ""
        }
      ],
      "solutions": [],
      "hints": [],
      "type": "backend",
      "isRequired": true,
      "releasedOn": "January 15, 2017",
      "translations": {}
    },
    {
      "id": "587d824a367417b2b2512c43",
      "title": "Personal Library",
      "description": [
        "Build a full stack JavaScript app that is functionally similar to this: <a href='https://spark-cathedral.glitch.me/' target='_blank'>https://spark-cathedral.glitch.me/</a>.",
        "Working on this project will involve you writing your code on Glitch on our starter project. After completing this project you can copy your public glitch url (to the homepage of your app) into this screen to test it! Optionally you may choose to write your project on another platform but must be publicaly visible for our testing.",
        "Start this project on Glitch using <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-library/'>this link</a> or clone <a href='https://github.com/freeCodeCamp/boilerplate-project-library/'>this repository</a> on GitHub! If you use Glitch, remember to save the link to your project somewhere safe!"
      ],
      "challengeSeed": [],
      "tests": [
        {
          "text": "Nothing from my website will be cached in my client.",
          "testString": ""
        },
        {
          "text": "The headers will say that the site is powered by 'PHP 4.2.0' even though it isn't (as a security measure).",
          "testString": ""
        },
        {
          "text": "I can post a title to /api/books to add a book and returned will be the object with the title and a unique _id.",
          "testString": ""
        },
        {
          "text": "I can get /api/books to retrieve an array of all books containing title, _id, and commentcount.",
          "testString": ""
        },
        {
          "text": "I can get /api/books/{id} to retrieve a single object of a book containing _title, _id, & an array of comments (empty array if no comments present).",
          "testString": ""
        },
        {
          "text": "I can post a comment to /api/books/{id} to add a comment to a book and returned will be the books object similar to get /api/books/{id} including the new comment.",
          "testString": ""
        },
        {
          "text": "I can delete /api/books/{_id} to delete a book from the collection. Returned will be 'delete successful' if successful.",
          "testString": ""
        },
        {
          "text": "If I try to request a book that doesn't exist I will be returned 'no book exists'.",
          "testString": ""
        },
        {
          "text": "I can send a delete request to /api/books to delete all books in the database. Returned will be 'complete delete successful' if successful.",
          "testString": ""
        },
        {
          "text": "All 6 functional tests required are complete and passing.",
          "testString": ""
        }
      ],
      "solutions": [],
      "hints": [],
      "type": "backend",
      "isRequired": true,
      "releasedOn": "January 15, 2017",
      "translations": {}
    },
    {
      "id": "587d824a367417b2b2512c44",
      "title": "Stock Price Checker",
      "description": [
        "Build a full stack JavaScript app that is functionally similar to this: <a href='https://giant-chronometer.glitch.me/' target='_blank'>https://giant-chronometer.glitch.me/</a>.",
        "Working on this project will involve you writing your code on Glitch on our starter project. After completing this project you can copy your public glitch url (to the homepage of your app) into this screen to test it! Optionally you may choose to write your project on another platform but must be publicaly visible for our testing.",
        "Start this project on Glitch using <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-stockchecker/'>this link</a> or clone <a href='https://github.com/freeCodeCamp/boilerplate-project-stockchecker/'>this repository</a> on GitHub! If you use Glitch, remember to save the link to your project somewhere safe!"
      ],
      "challengeSeed": [],
      "tests": [
        {
          "text": "Set the content security policies to only allow loading of scripts and css from your server.",
          "testString": ""
        },
        {
          "text": "I can GET /api/stock-prices with form data containing a Nasdaq stock ticker and recieve back an object stockData.",
          "testString": ""
        },
        {
          "text": "In stockData, I can see the stock(string, the ticker), price(decimal in string format), and likes(int).",
          "testString": ""
        },
        {
          "text": "I can also pass along field like as true(boolean) to have my like added to the stock(s). Only 1 like per ip should be accepted.",
          "testString": ""
        },
        {
          "text": "If I pass along 2 stocks, the return object will be an array with both stock's info. Instead of likes, it will display rel_likes(the difference between the likes on both stocks) on both.",
          "testString": ""
        },
        {
          "text": "A good way to receive current price is the following external API(replacing 'GOOG' with your stock): https://finance.google.com/finance/info?q=NASDAQ%3aGOOG",
          "testString": ""
        },
        {
          "text": "All 5 functional tests are complete and passing.",
          "testString": ""
        }
      ],
      "solutions": [],
      "hints": [],
      "type": "backend",
      "isRequired": true,
      "releasedOn": "January 15, 2017",
      "translations": {}
    },
    {
      "id": "587d824a367417b2b2512c45",
      "title": "Anonymous Message Board",
      "description": [
        "Build a full stack JavaScript app that is functionally similar to this: <a href='https://horn-celery.glitch.me/' target='_blank'>https://horn-celery.glitch.me/</a>.",
        "Working on this project will involve you writing your code on Glitch on our starter project. After completing this project you can copy your public glitch url (to the homepage of your app) into this screen to test it! Optionally you may choose to write your project on another platform but it must be publicaly visible for our testing.",
        "Start this project on Glitch using <a href='https://glitch.com/#!/import/github/freeCodeCamp/boilerplate-project-messageboard/'>this link</a> or clone <a href='https://github.com/freeCodeCamp/boilerplate-project-messageboard/'>this repository</a> on GitHub! If you use Glitch, remember to save the link to your project somewhere safe!"
      ],
      "challengeSeed": [],
      "tests": [
        {
          "text": "Only allow your site to be loading in an iFrame on your own pages.",
          "testString": ""
        },
        {
          "text": "Do not allow DNS prefetching.",
          "testString": ""
        },
        {
          "text": "Only allow your site to send the referrer for your own pages.",
          "testString": ""
        },
        {
          "text": "I can POST a thread to a specific message board by passing form data text and deletepassword_ to /api/threads/{board}.(Recommend res.redirect to board page /b/{board}) Saved will be at least _id, text, createdon_(date&time), bumpedon_(date&time, starts same as created_on), reported(boolean), deletepassword_, & replies(array).",
          "testString": ""
        },
        {
          "text": "I can POST a reply to a thread on a specific board by passing form data text, deletepassword_, & threadid_ to /api/replies/{board} and it will also update the bumped_on date to the comments date.(Recommend res.redirect to thread page /b/{board}/{thread_id}) In the thread's replies array will be saved _id, text, createdon_, deletepassword_, & reported.",
          "testString": ""
        },
        {
          "text": "I can GET an array of the most recent 10 bumped threads on the board with only the most recent 3 replies each from /api/threads/{board}. The reported and deletepasswords_ fields will not be sent to the client.",
          "testString": ""
        },
        {
          "text": "I can GET an entire thread with all its replies from /api/replies/{board}?thread_id={thread_id}. Also hiding the same fields the client should be see.",
          "testString": ""
        },
        {
          "text": "I can delete a thread completely if I send a DELETE request to /api/threads/{board} and pass along the threadid_ & deletepassword_. (Text response will be 'incorrect password' or 'success')",
          "testString": ""
        },
        {
          "text": "I can delete a post(just changing the text to '[deleted]' instead of removing completely like a thread) if I send a DELETE request to /api/replies/{board} and pass along the threadid_, replyid_, & deletepassword_. (Text response will be 'incorrect password' or 'success')",
          "testString": ""
        },
        {
          "text": "I can report a thread and change its reported value to true by sending a PUT request to /api/threads/{board} and pass along the threadid_. (Text response will be 'success')",
          "testString": ""
        },
        {
          "text": "I can report a reply and change its reported value to true by sending a PUT request to /api/replies/{board} and pass along the threadid_ & replyid_. (Text response will be 'success')",
          "testString": ""
        },
        {
          "text": "Complete functional tests that wholly test routes and pass.",
          "testString": ""
        }
      ],
      "solutions": [],
      "hints": [],
      "type": "backend",
      "isRequired": true,
      "releasedOn": "January 15, 2017",
      "translations": {}
    }
  ]
}
