diff --git a/.gitignore b/.gitignore index 0f002c43..f20b47cb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ node_modules/ -public/bin/ \ No newline at end of file +public/bin/ diff --git a/app/input/user_input.js b/app/input/user_input.js index 66a1a654..b7d13524 100644 --- a/app/input/user_input.js +++ b/app/input/user_input.js @@ -8,6 +8,7 @@ export default new GraphQLInputObjectType({ name: 'UserInput', fields: { _id: {type: GraphQLID}, - name: {type: GraphQLString} + username: {type: GraphQLString}, + password: {type: GraphQLString} } }); diff --git a/app/model/user_model.js b/app/model/user_model.js index 9469c9cb..33f7d7b7 100644 --- a/app/model/user_model.js +++ b/app/model/user_model.js @@ -1,8 +1,11 @@ import mongoose from 'mongoose'; var userSchema = new mongoose.Schema({ - name: { + username: { type: String + }, + password: { + type: String } }); diff --git a/app/type/user_type.js b/app/type/user_type.js index 813a50a0..228ae282 100644 --- a/app/type/user_type.js +++ b/app/type/user_type.js @@ -8,7 +8,10 @@ import { export default new GraphQLObjectType({ name: 'User', fields: { - name: { + username: { + type: GraphQLString + }, + password: { type: GraphQLString }, _id: { diff --git a/public/adapters/request_adapter.js b/public/adapters/request_adapter.js index 3c4ff2c0..c93c3f8f 100755 --- a/public/adapters/request_adapter.js +++ b/public/adapters/request_adapter.js @@ -1,8 +1,15 @@ class RequestAdapter { - constructor(url) { - } - - send(data) { + static send(payload, callback) { + let request = new XMLHttpRequest(); + request.open("POST", "/graphql", true); + request.setRequestHeader("Content-Type","application/json"); + request.setRequestHeader("Accept", "application/json"); + request.send(payload); + request.onreadystatechange = () => { + if (request.readyState === 4) { + callback(request.responseText); + } + } } } diff --git a/public/component/register.js b/public/component/register.js index 0c45884b..39068951 100644 --- a/public/component/register.js +++ b/public/component/register.js @@ -10,6 +10,7 @@ import { withStyles } from 'material-ui/styles'; import UserProtocol from "protocols/user_protocol"; import UserModel from "models/user_model"; +import RequestAdapter from "adapters/request_adapter"; class Register extends React.Component { constructor(props) { @@ -27,7 +28,12 @@ class Register extends React.Component { } register(username, password) { - UserProtocol.register(new UserModel({ username: username, password: password })); + let payload = new UserModel({ username: username.value , password: password.value }).mutationBuild(); + let callback = (result) => { + console.log(result); + }; + + RequestAdapter.send(payload, callback); } render() { diff --git a/public/models/user_model.js b/public/models/user_model.js index 2822597f..c41912fa 100644 --- a/public/models/user_model.js +++ b/public/models/user_model.js @@ -1,15 +1,28 @@ class UserModel { - constructor(element = {}) { - this._username = element.username; - this._password = element.password; + constructor(data) { + this.username = data.username; + this.password = data.password; } - get username() { - return this._username || ""; + username() { + return this.username || ""; } - get password() { - return this._password || ""; + password() { + return this.password || ""; + } + + mutationBuild() { + return JSON.stringify({ + query: "mutation {"+ + "addUser("+ + "data: { "+ + "username:"+ '"' + this.username + '"' + "," + + "password:"+ '"' + this.password + '"' + + "}" + + ")"+ + "}" + }); } } diff --git a/spec/app/input/user_input_spec.js b/spec/app/input/user_input_spec.js new file mode 100644 index 00000000..6da7fb36 --- /dev/null +++ b/spec/app/input/user_input_spec.js @@ -0,0 +1,17 @@ +import UserInput from "app/input/user_input"; + +describe("UserInput", () => { + describe(".default", () => { + it("return new graphql input object type", () => { + expect(UserInput.name).toEqual("UserInput"); + expect(UserInput._typeConfig.name).toEqual("UserInput"); + expect(UserInput._typeConfig.fields.hasOwnProperty("_id")).toEqual(true); + expect(UserInput._typeConfig.fields.hasOwnProperty("username")).toEqual(true); + expect(UserInput._typeConfig.fields.hasOwnProperty("password")).toEqual(true); + + expect(UserInput._typeConfig.fields._id.type.name).toEqual("ID"); + expect(UserInput._typeConfig.fields.username.type.name).toEqual("String"); + expect(UserInput._typeConfig.fields.password.type.name).toEqual("String"); + }); + }); +}); \ No newline at end of file diff --git a/spec/components/register_spec.js b/spec/components/register_spec.js index 8ea1c019..88527ed1 100755 --- a/spec/components/register_spec.js +++ b/spec/components/register_spec.js @@ -2,7 +2,7 @@ import React from "react"; import { shallow, mount } from "enzyme"; import Register from "components/register"; -import UserProtocol from "protocols/user_protocol"; +import RequestAdapter from "adapters/request_adapter"; import UserModel from "models/user_model"; describe("", () => { @@ -14,30 +14,30 @@ describe("", () => { }); describe("#registerClick", () => { - it("should call Register#register when clicked on register button", () => { - let component, e, rendered, spy; + it("should call Register#register when clicked on register button", () => { + let component, e, rendered, spy; - e = { preventDefault: jasmine.createSpy("preventDefault") }; + e = { preventDefault: jasmine.createSpy("preventDefault") }; - spy = spyOn(Register.prototype, "register"); - rendered = mount(); - rendered.find('button').simulate('click', 'using prototype'); + spy = spyOn(Register.prototype, "register"); + rendered = mount(); + rendered.find('button').simulate('click', 'using prototype'); - expect(spy).toHaveBeenCalled(); - }); + expect(spy).toHaveBeenCalled(); + }); }); describe("#register", () => { - it("should call UserProtocol#register", () => { + it("should call RequestAdapter#send", () => { let stubUserModel, component; stubUserModel = new UserModel({ username: "stub-username", password: "stub-password" }); - spyOn(UserProtocol, "register"); + spyOn(RequestAdapter, "send"); component = new Register(); component.register("stub-username", "stub-password"); - expect(UserProtocol.register).toHaveBeenCalledWith(stubUserModel); + expect(RequestAdapter.send).toHaveBeenCalled; }); }); \ No newline at end of file diff --git a/spec/models/user_model_spec.js b/spec/models/user_model_spec.js index 1926f3e5..facef8a7 100644 --- a/spec/models/user_model_spec.js +++ b/spec/models/user_model_spec.js @@ -1,12 +1,6 @@ import UserModel from "models/user_model"; describe("UserModel", () => { - describe("#constructor", () => { - it("doesn't throw error if argument empty", () => { - expect(UserModel.constructor).not.toThrowError(); - }); - }); - describe("#username", () => { it("return username", () => { let model; @@ -26,4 +20,26 @@ describe("UserModel", () => { expect(model.password).toEqual("stub-password"); }); }); + + describe(".mutationBuild", () => { + it("return json of mutation query", () => { + let model, expectedResult, stubUsername, stubPassword; + + stubUsername = "stub-username"; + stubPassword = "stub-password"; + model = new UserModel({ username: "stub-username", password: "stub-password" }).mutationBuild(); + expectedResult = JSON.stringify({ + query: "mutation {"+ + "addUser("+ + "data: { "+ + "username:" + '"' + stubUsername + '"' + "," + + "password:" + '"' + stubPassword + '"' + + "}" + + ")"+ + "}" + }); + + expect(model).toEqual(expectedResult); + }); + }); }); \ No newline at end of file diff --git a/webpack.resolve.config.js b/webpack.resolve.config.js index 01b6f588..7fab3e21 100755 --- a/webpack.resolve.config.js +++ b/webpack.resolve.config.js @@ -15,7 +15,8 @@ webpackResolve = ( stores: path.resolve(__dirname, "public/stores/"), supports: path.resolve(__dirname, "public/supports/"), stylesheets: path.resolve(__dirname, "public/stylesheets/"), - models: path.resolve(__dirname, "public/models/") + models: path.resolve(__dirname, "public/models/"), + app: path.resolve(__dirname, "app/") } } );