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/")
}
}
);